以前看過類似的五子棋題目,但都沒有親自去寫過。這道題目的輸出給了提示,可以先從左到右再從上到下掃,以每個非空格的格子作為起始點往右,下,右下(斜下),右上(斜上),然後判斷是否為連續5個的同色棋子,再另外判斷兩端是否相同,如果是6個連續的不算贏,以前不知道有5個以上是否能算贏!
還有一個出現的問題就是x,y和i,j,我的一般程序中習慣i,j代表行(row)和列(column),但是x,y習慣表示橫坐標和縱坐標,即是先column後row,在right_up中,原來是 x=i+right_upX[u]; y=j+right_upY[u];是錯的。應該是x=i+right_upY[u];y=j+right_upX[u];
1970 | Accepted | 136K | 0MS | C++ | 3933B | 2014-07-14 00:00:12 |
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int board[30][30];
int right_downX[]={-1,1,2,3,4,5},right_downY[]={-1,1,2,3,4,5},rightY[]={0,0,0,0,0,0},rightX[]={-1,1,2,3,4,5},
downY[]={-1,1,2,3,4,5},downX[]={0,0,0,0,0,0},right_upX[]={-1,1,2,3,4,5},right_upY[]={1,-1,-2,-3,-4,-5};
int check_right(int i,int j)
{
int x,y;
int chess=board[i][j];
for(int u=1;u<5;u++)
{
x=i+rightX[u];
y=j+rightY[u];
int k=board[x][y];
if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
return 0;
}
x=i+rightX[0];
y=j+rightY[0];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
x=i+rightX[5];
y=j+rightY[5];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
return 1;
}
int check_down(int i,int j)
{
int x,y;
int chess=board[i][j];
for(int u=1;u<5;u++)
{
x=i+downX[u];
y=j+downY[u];
int k=board[x][y];
if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
return 0;
}
x=i+downX[0];
y=j+downY[0];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
x=i+downX[5];
y=j+downY[5];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
return 1;
}
int check_right_up(int i,int j)
{
int x,y;
int chess=board[i][j];
for(int u=1;u<5;u++)
{
x=i+right_upY[u];
y=j+right_upX[u];
int k=board[x][y];
if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
return 0;
}
x=i+right_upY[0];
y=j+right_upX[0];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
x=i+right_upY[5];
y=j+right_upX[5];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
return 1;
}
int check_right_down(int i,int j)
{
int x,y;
int chess=board[i][j];
for(int u=1;u<5;u++)
{
x=i+right_downX[u];
y=j+right_downY[u];
int k=board[x][y];
if(!(x>0 && x<20 && y>0 && y<20 && chess==k))
return 0;
}
x=i+right_downX[0];
y=j+right_downY[0];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
x=i+right_downX[5];
y=j+right_downY[5];
if(x>0 && x<20 && y>0 && y<20 && board[x][y]==chess)
return 0;
return 1;
}
int main()
{
freopen("in.txt","r",stdin);
int t,n,m,i,j;
scanf("%d",&t);
while(t--)
{
memset(board,0,sizeof(board));
for(i=1;i<=19;i++)
for(j=1;j<=19;j++)
scanf("%d",&board[i][j]);
int if_win=0;
for(i=1;i<=19;i++)
{for(j=1;j<=19;j++)
{
if(board[i][j]==0) continue;
if_win=check_right(i,j);
if(if_win)
{
printf("%d\n%d %d\n",board[i][j],i,j);
// printf("A\n");
break;
}
if_win=check_down(i,j);
if(if_win)
{
printf("%d\n%d %d\n",board[i][j],i,j);
// printf("AA\n");
break;
}
if_win=check_right_up(i,j);
if(if_win)
{
printf("%d\n%d %d\n",board[i][j],i,j);
// printf("AAA\n");
break;
}
if_win=check_right_down(i,j);
if(if_win)
{
printf("%d\n%d %d\n",board[i][j],i,j);
// printf("AAAA\n");
break;
}
}
if(if_win==1) break;
}
if(if_win==0) printf("0\n");
// printf("if_win=%d\n",if_win);
// printf("t=%d\n",t);
}
return 0;
}