CCF認證 2018 3 棋局評估

2021-08-27 05:57:55 字數 2300 閱讀 7117

問題描述

alice和bob正在玩井字棋遊戲。

井字棋遊戲的規則很簡單:兩人輪流往3*3的棋盤中放棋子,alice放的是「x」,bob放的是「o」,alice執先。當同一種棋子佔據一行、一列或一條對角線的三個格仔時,遊戲結束,該種棋子的持有者獲勝。當棋盤被填滿的時候,遊戲結束,雙方平手。

alice設計了一種對棋局評分的方法:

- 對於alice已經獲勝的局面,評估得分為(棋盤上的空格子數+1);

- 對於bob已經獲勝的局面,評估得分為 -(棋盤上的空格子數+1);

- 對於平局的局面,評估得分為0;

例如上圖中的局面,alice已經獲勝,同時棋盤上有2個空格,所以局面得分為2+1=3。

由於alice並不喜歡計算,所以他請教擅長程式設計的你,如果兩人都以最優策略行棋,那麼當前局面的最終得分會是多少?

輸入格式

輸入的第一行包含乙個正整數t,表示資料的組數。

每組資料輸入有3行,每行有3個整數,用空格分隔,分別表示棋盤每個格仔的狀態。0表示格仔為空,1表示格仔中為「x」,2表示格仔中為「o」。保證不會出現其他狀態。

保證輸入的局面合法。(即保證輸入的局面可以通過行棋到達,且保證沒有雙方同時獲勝的情況)

保證輸入的局面輪到alice行棋。

輸出格式

對於每組資料,輸出一行乙個整數,表示當前局面的得分。

樣例輸入

3 1 2 1

2 1 2

0 0 0

2 1 1

0 2 1

0 0 2

0 0 0

0 0 0

0 0 0

樣例輸出

3 -4

0樣例說明

第一組資料:

alice將棋子放在左下角(或右下角)後,可以到達問題描述中的局面,得分為3。

3為alice行棋后能到達的局面中得分的最大值。

第二組資料:

bob已經獲勝(如圖),此局面得分為-(3+1)=-4。

第三組資料:

井字棋中若雙方都採用最優策略,遊戲平局,最終得分為0。

資料規模和約定

對於所有評測用例,1 ≤ t ≤ 5。

時間限制: 1.0s

記憶體限制: 256.0mb

題目分析

一直聽大佬們說博弈論啥的,我也不太會,這種題我認為可以直接當做dp做就可以。

這道題我直接用遞迴思維去推的,題目給出的得分機制十分奇妙,直接去尋找極大極小就可以了,不需要自己重新轉換得分機制。

**如下

#include

using

namespace

std;

int count0, map[3][3];

int win() //判斷當前局面的勝負情況

int try1(int turn, int x) //遞迴嘗試棋盤,返回值代表下棋人當前回合的最優分數,turn是測試用的引數可以去掉,x代表下棋人的標號,1是圈,2是叉

}if (max == -10 && min == 10) return

0; //沒有更新最優值,說明棋局沒有可下,為平局

if (x == 1) return max; //圈的人返回極大值

else

return min; //叉的人返回極小值

}int main()

cout

<1, 1);

if (i != t-1) cout

0;}

tips

1. 注意棋局結束條件不要寫錯了

2. 對於極大極小值的初始值不能設定為0,會存在乙個棋局必贏或必輸,極值為0會影響資料判斷(注意數值邊界處理)

總結

最後調bug就倒在極值邊界問題的處理上了,寫遞迴函式的時候一定要細心處理一些遞推條件、結束條件以及中間變數邊界判斷

ccf認證 201803 4 棋局評估

題目 alice和bob正在玩井字棋遊戲。井字棋遊戲的規則很簡單 兩人輪流往3 3的棋盤中放棋子,alice放的是 x bob放的是 o alice執先。當同一種棋子佔據一行 一列或一條對角線的三個格仔時,遊戲結束,該種棋子的持有者獲勝。當棋盤被填滿的時候,遊戲結束,雙方平手。alice設計了一種對...

ccf 棋局評估(對抗搜尋)

參考部落格 問題描述 試題編號 201803 4 試題名稱 棋局評估 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 alice和bob正在玩井字棋遊戲。井字棋遊戲的規則很簡單 兩人輪流往3 3的棋盤中放棋子,alice放的是 x bob放的是 o alice執先。當同一種棋子佔...

CCF201803 4 棋局評估(100分)

問題描述 試題編號 201803 4 試題名稱 棋局評估 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 alice和bob正在玩井字棋遊戲。井字棋遊戲的規則很簡單 兩人輪流往3 3的棋盤中放棋子,alice放的是 x bob放的是 o alice執先。當同一種棋子佔據一行 一列...