結果

問題 No.355 数当てゲーム(2)
ユーザー yuki2006yuki2006
提出日時 2017-01-05 14:32:19
言語 Go
(1.22.1)
結果
AC  
実行時間 29 ms / 2,000 ms
コード長 2,532 bytes
コンパイル時間 13,311 ms
コンパイル使用メモリ 201,980 KB
実行使用メモリ 24,360 KB
平均クエリ数 14.60
最終ジャッジ日時 2023-09-24 00:49:34
合計ジャッジ時間 15,280 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 29 ms
24,000 KB
testcase_01 AC 26 ms
23,592 KB
testcase_02 AC 26 ms
23,976 KB
testcase_03 AC 25 ms
23,340 KB
testcase_04 AC 25 ms
24,000 KB
testcase_05 AC 26 ms
23,400 KB
testcase_06 AC 26 ms
23,376 KB
testcase_07 AC 25 ms
24,264 KB
testcase_08 AC 26 ms
23,640 KB
testcase_09 AC 26 ms
24,360 KB
testcase_10 AC 25 ms
23,496 KB
testcase_11 AC 26 ms
23,520 KB
testcase_12 AC 26 ms
24,300 KB
testcase_13 AC 26 ms
23,592 KB
testcase_14 AC 25 ms
24,312 KB
testcase_15 AC 25 ms
23,604 KB
testcase_16 AC 25 ms
23,388 KB
testcase_17 AC 26 ms
23,340 KB
testcase_18 AC 25 ms
23,664 KB
testcase_19 AC 26 ms
23,520 KB
testcase_20 AC 26 ms
23,412 KB
testcase_21 AC 26 ms
23,976 KB
testcase_22 AC 25 ms
23,352 KB
testcase_23 AC 25 ms
23,580 KB
testcase_24 AC 25 ms
24,324 KB
testcase_25 AC 26 ms
23,664 KB
testcase_26 AC 26 ms
23,376 KB
testcase_27 AC 25 ms
23,616 KB
testcase_28 AC 26 ms
23,388 KB
testcase_29 AC 25 ms
23,976 KB
testcase_30 AC 26 ms
23,400 KB
testcase_31 AC 25 ms
24,276 KB
testcase_32 AC 26 ms
23,964 KB
testcase_33 AC 26 ms
23,592 KB
testcase_34 AC 26 ms
23,952 KB
testcase_35 AC 25 ms
23,604 KB
testcase_36 AC 26 ms
23,364 KB
testcase_37 AC 25 ms
23,628 KB
testcase_38 AC 25 ms
23,592 KB
testcase_39 AC 26 ms
23,532 KB
testcase_40 AC 25 ms
23,508 KB
testcase_41 AC 26 ms
23,484 KB
testcase_42 AC 26 ms
23,976 KB
testcase_43 AC 25 ms
23,400 KB
testcase_44 AC 26 ms
23,796 KB
testcase_45 AC 26 ms
23,520 KB
testcase_46 AC 26 ms
23,580 KB
testcase_47 AC 26 ms
23,964 KB
testcase_48 AC 26 ms
24,012 KB
testcase_49 AC 26 ms
23,592 KB
testcase_50 AC 25 ms
23,400 KB
testcase_51 AC 25 ms
24,012 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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
}

0