时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
在五子棋对战中,我们有以下相关术语:
〖阳线〗即:直线,棋盘上可见的横纵直线。
〖阴线〗即:斜线,由交叉点构成的与阳线成45凹薪堑囊涡毕摺?
〖四〗在一条阳线或阴线上连续相邻的5个点上只有四枚同色棋子的棋型。
〖活四〗有两个点可以成五的四。
〖冲四〗只有一个点可以成五的四。
〖五连〗只有五枚同色棋子在一条阳线或阴线上相邻成一排。
〖长连〗五枚以上同色棋子在一条阳线或阴线上相邻成一排。
此题要求同学们编写程序,判断在给定点放给定颜色的子后是否会有活四这种棋型出现。
输入:
对于本题,首先读入的是当前棋盘的状态,共15行,每行15个数字,1代表白棋,2代表黑棋,0代表为空格(未下子)。第16行有3个数字R,C,N代表给定点的行、列和放子的颜色。
输出:
若出现则输出Yes,否则输出No.
输入样例:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 2 2 0 0 1
0 2 2 2 0 0 0 0 2 0 0 0 0 0 1
0 1 0 1 1 0 2 0 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 2 0 0 1 0 0 0
2 0 0 0 0 1 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 1 0 1 0 0 0
2 0 0 0 0 0 0 1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 2 1 0 0 0 0 1 0
0 0 0 0 0 0 2 2 0 0 0 0 1 0 0
2 0 0 0 0 2 0 0 0 0 0 1 0 0 0
0 2 0 1 1 0 0 2 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 1 0 0 0 0 0
0 2 2 2 2 0 0 0 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
1 3 1
输出样例:
No
提示:
注意阴线,阳线一起判断。 这里我们认为...1011101...不构成活四。
#include<stdio.h> int main() { int i,j,k=0; int R,C,N; int count=0,r1,c1,r2,c2; int LFOUR=0,board=0; int Arr[15][15]={0}; for(i=0;i<15;i++) for(j=0;j<15;j++) scanf("%d",&Arr[i][j]); scanf("%d%d%d",&R,&C,&N); Arr[R][C]=N; //横向 count=0;board=0; for(j=C;j<15;j++)//右 if(Arr[R][j]==Arr[R][C]) count++; else { r1=R;c1=j; break; } if(j==15) board=1;//到边界 for(j=C-1;j>=0;j--)//左 if(Arr[R][j]==Arr[R][C]) count++; else { r2=R;c2=j; break; } if(j==-1) board=1;//到边界 if(board==0)//一边到了边界就一定构不成活四//board==0才有r1,c2,r2,c2 if(count==4 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) //连四两边都为空 if( (c1+1==15||(c1+1<15&&Arr[r1][c1+1]!=Arr[R][C])) //右边不会构成长连 && (c2-1==-1||(c2-1>=0&&Arr[r2][c2-1]!=Arr[R][C])) ) //左边不会构成长连 LFOUR++; //纵向 count=0;board=0; for(i=R;i<15;i++)//下 if(Arr[i][C]==Arr[R][C]) count++; else { r1=i;c1=C; break; }//(5,8) if(i==15) board=1; for(i=R-1;i>=0;i--)//上 if(Arr[i][C]==Arr[R][C]) count++; else { r2=i;c2=C; break; }//(0,8) if(i==-1) board=1;//0 if(board==0) if(count==4 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) if( (r1+1==15||(r1+1<15&&Arr[r1+1][c1]!=Arr[R][C])) //下边不会构成长连 &&(r2-1==-1||(r2-1>=0&&Arr[r2-1][c2]!=Arr[R][C])) ) //上边不会构成长连 LFOUR++; //斜左 count=0;board=0; for(i=R,j=C;i>=0,j>=0;i--,j--)//左上 if(Arr[i][j]==Arr[R][C]) count++; else { r1=i; c1=j; break;} if(i==-1||j==-1) board=1; for(i=R+1,j=C+1;i<15,j<15;i++,j++)//右下 if(Arr[i][j]==Arr[R][C]) count++; else { r2=i; c2=j; break;} if(i==15||j==15) board=1; if(board==0) if(count==4 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) if( (r1-1==-1||c1-1==-1||(r1-1>=0&&c1-1>=0&&Arr[r1-1][c1-1]!=Arr[R][C])) //左上边不会构成长连 &&(r2+1==15||c2+1==15||(r2+1<15&&c2+1<15&&Arr[r2+1][c2+1]!=Arr[R][C])) ) //右下边不会构成长连 LFOUR++; //斜右 count=0;board=0; for(i=R,j=C;i>=0,j<15;i--,j++)//右上 if(Arr[i][j]==Arr[R][C]) count++; else { r1=i; c1=j; break; } if(i==-1||j==15) board=1; for(i=R+1,j=C-1;i<15,j>=0;i++,j--)//左下 if(Arr[i][j]==Arr[R][C]) count++; else { r2=i; c2=j; break; } if(i==15||j==-1) board=1; if(board==0) if(count==4 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) if( (r1-1==-1||c1+1==15||(r1-1>=0&&c1+1<15&&Arr[r1-1][c1+1]!=Arr[R][C])) //右上边不会构成长连 &&(r2+1==15||c2-1==-1||(r2+1<15&&c2-1>=0&&Arr[r2+1][c2-1]!=Arr[R][C])) ) //右下边不会构成长连 LFOUR++; if(LFOUR>=1) printf("Yes\n"); else printf("No\n"); return 0; }