Tic-tac-toe
阿新 • • 發佈:2022-04-08
【題目描述】
顯然,我們每個人都熟悉Tic-tac-toe遊戲。
這個遊戲的規則是:兩個人依次在3X3的棋盤上下棋。
當一個人有3個棋子連成一行或一列或一縱列時,則這個人已經獲得勝利。這時則停止下棋。第一個人先下,第二個人後下。
現在,請你判斷一遊戲的狀態。
first
,現在輪到第一個人下。
second
,現在輪到第二個人下。
the first player won
,如果第一個人剛剛贏得比賽。
the second player won
,如果第二個人剛剛贏得比賽。
illegal
,如果這種棋局不可能出現。
draw
,如果棋盤已經下滿且無法分出勝負。
【輸入】
一個3X3的矩陣,用X和.和0表示。
X表示第一個人的棋子,0表示第二個人的棋子。
.表示該位置還未下。
【輸出】
一個字串,即上述六種狀態的一種。
【輸入樣例】
X0X
.0.
.X.
【輸出樣例】
second
【資料範圍】
30(3個點) 答案只含有first,second和draw
70(7個點) 答案只含有其他3種情況
時間限制 : 1s
空間限制 : 256M
極其繁瑣的分類討論。
先看一下怎麼樣子是不可能的。首先如果兩個人的棋子數量差距太大,肯定是不對的。準確的說,如果先手比後手多出超過1個或者後手比先手多,那就不合法。同時,如果兩個人都贏了,本來一個人一贏遊戲就停止,所以也不合法。
平局的情況好像也很簡單,如果棋盤滿了並且沒有人贏,那就平局。
剩下的要先看一下有沒有人贏,如果有那麼就輸出他贏了,否則就看一下先手是否比後手多,判斷下一個是誰就好了。
#include<iostream> using namespace std; char c[5][5]; int cnt1,cnt2,f1,f2; int main() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>c[i][j]; cnt1=cnt2=0; for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) { if(c[i][j]=='0') cnt1++; if(c[i][j]=='X') cnt2++; } } if(cnt1>cnt2||cnt2-cnt1>1) { cout<<"illegal"; return 0; } if(c[1][1]=='0'&&c[2][1]=='0'&&c[3][1]=='0') f1=1; if(c[1][2]=='0'&&c[2][2]=='0'&&c[3][2]=='0') f1=1; if(c[1][3]=='0'&&c[2][3]=='0'&&c[3][3]=='0') f1=1; if(c[1][1]=='0'&&c[1][2]=='0'&&c[1][3]=='0') f1=1; if(c[2][1]=='0'&&c[2][2]=='0'&&c[2][3]=='0') f1=1; if(c[3][1]=='0'&&c[3][2]=='0'&&c[3][3]=='0') f1=1; if(c[1][1]=='0'&&c[2][2]=='0'&&c[3][3]=='0') f1=1; if(c[1][3]=='0'&&c[2][2]=='0'&&c[3][1]=='0') f1=1; if(c[1][1]=='X'&&c[2][1]=='X'&&c[3][1]=='X') f2=1; if(c[1][2]=='X'&&c[2][2]=='X'&&c[3][2]=='X') f2=1; if(c[1][3]=='X'&&c[2][3]=='X'&&c[3][3]=='X') f2=1; if(c[1][1]=='X'&&c[1][2]=='X'&&c[1][3]=='X') f2=1; if(c[2][1]=='X'&&c[2][2]=='X'&&c[2][3]=='X') f2=1; if(c[3][1]=='X'&&c[3][2]=='X'&&c[3][3]=='X') f2=1; if(c[1][1]=='X'&&c[2][2]=='X'&&c[3][3]=='X') f2=1; if(c[1][3]=='X'&&c[2][2]=='X'&&c[3][1]=='X') f2=1; if(f1&&f2) { cout<<"illegal"; return 0; } if(cnt1+cnt2==9&&!f1&&!f2) { cout<<"draw"<<endl; return 0; } if(f1) cout<<"the second player won"; else if(f2) cout<<"the first player won"; else if(cnt1==cnt2) cout<<"first"; else if(cnt2>cnt1) cout<<"second"; return 0; }