結果
| 問題 | No.355 数当てゲーム(2) | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2017-01-05 14:32:19 | 
| 言語 | Go (1.23.4) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 26 ms / 2,000 ms | 
| コード長 | 2,532 bytes | 
| コンパイル時間 | 16,567 ms | 
| コンパイル使用メモリ | 222,864 KB | 
| 実行使用メモリ | 25,452 KB | 
| 平均クエリ数 | 14.60 | 
| 最終ジャッジ日時 | 2024-07-17 00:44:26 | 
| 合計ジャッジ時間 | 18,706 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 52 | 
ソースコード
package main
import (
	"fmt"
	"os"
	"strconv"
)
func ask(v []int) (X int, Y int) {
	fmt.Printf("%d %d %d %d\n", v[0], v[1], v[2], v[3])
	os.Stdout.Sync()
	fmt.Scan(&X, &Y)
	if X == 4 && Y == 0 {
		os.Exit(0)
	}
	return
}
func preCheck() ([]bool, []int) {
	v := make([]int, 4)
	v[0] = 0
	v[1] = 1
	v[2] = 2
	v[3] = 3
	ans := make([]int, 4)
	for p := 0; p < 4; p++ {
		ans[p] = -1
	}
	nums := make([]bool, 10)
	xFirst, yFirst := ask(v)
	for k := 3; k >= 0; k-- {
		old := v[k]
		for i := 4; i <= 9; i++ {
			for {
				ok := true
				for p := 0; p < 4; p++ {
					if p != k && v[p] == i {
						i++
						if i == 10 {
							break
						}
						ok = false
						break
					}
				}
				if ok {
					break
				}
			}
			if i == 10 {
				continue
			}
			v[k] = i
			x, y := ask(v)
			if x+y == 4 {
				// 偶然にも数字を特定した
				for i := 0; i < 4; i++ {
					nums[v[i]] = true
				}
				return nums, ans
			}
			if xFirst < x {
				// 単純に正しい一致数字を当てた
				ans[k] = i
				nums[v[k]] = true
				v[k] = i
				if xFirst+yFirst == x+y {
					// 数字を当てたが、変更前の数字があるはず
					nums[old] = true
				}
				xFirst = x
				yFirst = y
				break
			} else if xFirst > x {
				// 単純に正しい数字を外した
				v[k] = old
				ans[k] = v[k]
				nums[v[k]] = true
				break
			} else if yFirst > y {
				// 数字を外した
				v[k] = old
				nums[v[k]] = true
				break
			} else if yFirst < y {
				nums[v[k]] = true
				xFirst = x
				yFirst = y
				break
			}
		}
		old = v[k]
	}
	return nums, ans
}
func main() {
	nums, ans := preCheck()
	v := make([]int, 4)
	notAns := make([]int, 0)
	numList := make([]int, 0)
	for v := 0; v < 10; v++ {
		if nums[v] {
			ansFlag := false
			for j := 0; j < 4; j++ {
				ansFlag = ansFlag || ans[j] == v
			}
			if !ansFlag {
				numList = append(numList, v)
			}
		} else {
			notAns = append(notAns, v)
		}
	}
	p := 0
	for i := 0; i < 4; i++ {
		if ans[i] >= 0 {
			v[i] = ans[i]
		} else {
			// あえて不正解の値を入れる
			v[i] = notAns[p]
			p++
		}
	}
	xFirst, _ := ask(v)
	for i := 0; i < 4; i++ {
		if ans[i] < 0 {
			for p := 0; p < len(numList); p++ {
				v[i] = numList[p]
				x, _ := ask(v)
				if xFirst < x {
					ans[i] = numList[p]
					numList = append(numList[:p], numList[p+1:]...)
					xFirst = x
					break
				}
			}
		}
	}
}
func mapToString(arr []int) []string {
	ret := make([]string, len(arr))
	for i := 0; i < len(arr); i++ {
		ret[i] = strconv.Itoa(arr[i])
	}
	return ret
}
            
            
            
        