昨天集训队比赛的题目,比赛时悲剧的没做出来。早上想想可以的~~~
题意:两名选手玩三子棋的游戏,看题目给出的数据数否符合游戏结束的条件。两名选手分别拿O和X,`代表空格没填。我是搜索符合游戏结束的情况。行和列加上两条对角线(四种情况)。
代码如下:
#include<iostream>
using namespace std;
char map[4][4];
int i,j;
bool vict(char c)
{
for( i=0;i<3;i++) //搜索每一行
for( j=0;i<3;j++)
{
if(map[i][j]!=c)
break;
if(j==2) return 1;
}
for( i=0;i<3;i++) //搜索每一列
for( j=0;j<3;j++)
{
if(map[j][i]!=c)
break;
if(j==2)
return 1;
}
for( i=0;i<3;i++) //搜索左上到右下的对角线
{
if(map[i][i]!=c)
break;
if(i==2)
return 1;
}
for( i=0;i<3;i++) //搜索右上到左下的对角线
{
if(map[i][2-i]!=c)
break;
if(i==2)
return 1;
}
return 0;
}
bool check()
{
int no,nx,nf;
no=nx=nf=0;
for( i=0;i<3;i++)
for( j=0;j<3;j++)
if(map[i][j]=='O') no++;
else if(map[i][j]=='X') nx++;
else nf++;
if(nx<no || nx>no+1) return 0;//不符合停止条件,因为nx代表先手。
if(vict('O') && nx>no) return 0;//当后手赢时,应该nx=no,所以return 0。
if(!nf || vict('O') || vict('X'))
return 1;
return 0;
}
int main()
{
while(cin>>map[0][0] && map[0][0]!='e') //判断第一个数据是不是符合继续输入的标准
{
cin>>map[0][1]>>map[0][2]; //因为第一个判断了,所以这一行剩下的我就一个一个输入了(好原始的方法)。
for( i=1;i<3;i++)
for( j=0;j<3;j++)
cin>>map[i][j];
if(!check()) cout<<"in";
cout<<"valid\n";
}
return 0;
}