結果

問題 No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう!
コンテスト
ユーザー ID 21712
提出日時 2025-12-27 12:52:06
言語 Go
(1.25.5)
結果
AC  
実行時間 2,621 ms / 5,000 ms
コード長 1,339 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 12,996 ms
コンパイル使用メモリ 244,740 KB
実行使用メモリ 26,072 KB
スコア 6,976,000
平均クエリ数 30240.00
最終ジャッジ日時 2025-12-27 12:56:41
合計ジャッジ時間 274,245 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 100
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

package main

// 解説読んだ

import . "fmt"
import . "os"
import bf "bufio"

func main() {
	rd := bf.NewReader(Stdin)
	wr := bf.NewWriter(Stdout)
	defer wr.Flush()

	nums := make([]int, 0, 30240)
	for i := 0; i < 1e5; i++ {
		ccc := make([]int, 10)
		for k, t := 0, i; k < 5; k++ {
			ccc[t%10]++
			if ccc[t%10] > 1 {
				ccc[0] = -1
				break
			}
			t /= 10
		}
		if ccc[0] < 0 {
			continue
		}
		nums = append(nums, i)
	}
	
	omits := make([]int, 0, len(nums))
	tnums := make([]int, 0, len(nums))

	for len(nums)+len(omits) > 0 {
		var n int
		if len(omits) > 0 {
			n = omits[0]
			omits = omits[1:]
		} else {
			n = nums[0]
			nums = nums[1:]
		}
		Fprintf(wr, "%05d\n", n)
		wr.Flush()
		fin := false
		mm := make([]int, 100)
		for i := 0; i < 30; i++ {
			var hi, bi int
			Fscan(rd, &hi, &bi)
			if i == 0 && hi == 5 {
				fin = true
			}
			mm[hi * 10 + bi]++
		}
		if fin {
			return
		}
		tnums = tnums[:0]
		for _, t := range nums {
			h, b := hitAndBlow(n, t)
			if mm[h*10+b] > 0 {
				tnums = append(tnums, t)
			} else {
				omits = append(omits, t)
			}
		}
		nums, tnums = tnums, nums
	}
	
}

func hitAndBlow(x, y int) (h, b int) {
	for i := 0; i < 5; i++ {
		for j, ty := 0, y; j < 5; j++ {
			if x % 10 == ty % 10 {
				if i == j {
					h++
				} else {
					b++
				}
			}
			ty /= 10
		}
		x /= 10
	}
	return
}
0