1. 程式人生 > 其它 >Tic-tac-toe

Tic-tac-toe

【題目描述】
顯然,我們每個人都熟悉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;
}