問題描述
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行棋。
輸出格式
對於每組資料,輸出一行乙個整數,表示當前局面的得分。
樣例輸入
31 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。
#includeusing namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;ihas;
mapans;
int vis[5][5],mat[5][5];
int check(int sum,string tt)
} rep(i,0,3)
} if(ok)
} int ok=1;
rep(i,0,3)
} if(ok)
ok=1;
rep(i,0,3)
} if(ok)
return 0;}/*
31 2 1
2 1 2
0 0 0
2 1 1
0 2 1
0 0 2
30 0 0
0 0 0
0 0 0
*/int dfs(int sum)
int tmp=check(sum,tt);
if(check(sum,tt))
if(sum==9)return 0;
int mx=-100,mi=100;
rep(i,0,3)
} }has.insert(tt);
ans[tt]=sum&1?mi:mx;
return ans[tt];
}int main()
int res=dfs(num);
printf("%d\n",res);
} return 0;
}
深搜考慮 終止條件的判斷:
1.有幾個終止條件
2.幾個終止條件的先後順序 (是不是條件之間會相互影響)
應該也可以 考慮 每個點 填/不填, 這樣最後的結果應該也是可以的。
不能 先空再填,這樣就會錯誤。
那個列的列舉,一定記得那個
201803 4 棋局評估
這道題當初卡了我不知道多少遍,每次動手想做一下csp認證的第三道題,都從這道題開始,但每次都被卡住。直接是連題意都有點讀不懂,但是讀懂了之後就會發現,這道題除了特別繁瑣之外,好像也沒用到什麼很難的演算法。借鑑了這位大佬的思路 我沒發現比這個還簡潔的 所以就學了一下這個思路,比較容易理解。對這道題,我...
201803 4 CFF 棋局評估
對抗搜尋。感謝這位博主的分享,給了我很大幫助。主要用到了圖裡面的公式。下面剪枝我沒看呢還。這次的 應該不算shi了吧 雖然也不是很好就是了。另外這次最後的編譯一次通過,小小開心一下 不過寫得很慢,考試肯定來不及 include include includeusing namespace std d...
ccf認證 201803 4 棋局評估
題目 alice和bob正在玩井字棋遊戲。井字棋遊戲的規則很簡單 兩人輪流往3 3的棋盤中放棋子,alice放的是 x bob放的是 o alice執先。當同一種棋子佔據一行 一列或一條對角線的三個格仔時,遊戲結束,該種棋子的持有者獲勝。當棋盤被填滿的時候,遊戲結束,雙方平手。alice設計了一種對...