时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
〖阳线〗即:直线,棋盘上可见的横纵直线。
〖阴线〗即:斜线,由交叉点构成的与阳线成45凹薪堑囊涡毕摺?
〖三〗在一条阳线或阴线上连续相邻的5个点上只有三枚同色棋子的棋型。
〖四〗在一条阳线或阴线上连续相邻的5个点上只有四枚同色棋子的棋型
〖活三〗再走一着可以形成活四的三。 〖眠三〗再走一着可以形成冲四的三。
〖活四〗有两个点可以成五的四。 〖冲四〗只有一个点可以成五的四。
注意活三有2种形式:
〖连活三〗即:连的活三(同色棋子在一条阳线或阴线上相邻成一排的活三)。简称“连三”。
〖跳活三〗中间隔有一个空点的活三。简称“跳三”。
此题要求同学们编写程序,判断给给定点放给定颜色的子后是否会有活三这种棋型出现。
输入:
对于本题,首先读入的是当前棋盘的状态,共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 9 2
输出样例:
Yes
提示:
..2011102...不是活三,而是眠三
#include<stdio.h> int main() { int i,j,k=0; int R,C,N; int count=0,r1,c1,r2,c2; int LTHREE=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==3 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) //连三两边都为空 { if( (c1+1<15&&Arr[r1][c1+1]==0) //右边不会构成长连 ||(c2-1>=0&&Arr[r2][c2-1]==0) ) //左边不会构成长连 LTHREE++; }else if(count==2 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((c1+1<15&&Arr[r1][c1+1]==Arr[R][C])&&(c1+2<15&&Arr[r1][c1+2]==0)) //右边构成活三 ||((c2-1>=0&&Arr[r2][c2-1]==Arr[R][C])&&(c2-2>=0&&Arr[r2][c2-2]==0)) ) //左边构成活三 LTHREE++; }else if(count==1 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((c1+1<15&&Arr[r1][c1+1]==Arr[R][C])&&(c1+2<15&&Arr[r1][c1+2]==Arr[R][C])&&(c1+3<15&&Arr[r1][c1+3]==0)) //右边构成活三 ||((c2-1>=0&&Arr[r2][c2-1]==Arr[R][C])&&(c2-2>=0&&Arr[r2][c2-2]==Arr[R][C])&&(c2-3>=0&&Arr[r2][c2-3]==0)) ) //左边构成活三 LTHREE++; } //纵向 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==3 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( (r1+1<15&&Arr[r1+1][c1]==0) //下边构成活三 ||(r2-1>=0&&Arr[r2-1][c2]==0) ) //上边构成活三 LTHREE++; }else if(count==2 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((r1+1<15&&Arr[r1+1][c1]==Arr[R][C])&&(r1+2<15&&Arr[r1+2][c1]==0)) //下边构成活三 ||((r2-1>=0&&Arr[r2-1][c2]==Arr[R][C])&&(r2-2>=0&&Arr[r2-2][c2]==0)) ) //上边构成活三 LTHREE++; }else if(count==1 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((r1+1<15&&Arr[r1+1][c1]==Arr[R][C])&&(r1+2<15&&Arr[r1+2][c1]==Arr[R][C])&&(r1+3<15&&Arr[r1+3][c1]==0)) //下边构成活三 ||((r2-1>=0&&Arr[r2-1][c2]==Arr[R][C])&&(r2-2>=0&&Arr[r2-2][c2]==Arr[R][C])&&(r2-3>=0&&Arr[r2-3][c2]==0)) ) //上边构成活三 LTHREE++; } //斜左 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==3 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( (r1-1>=0&&c1-1<15&&Arr[r1-1][c1-1]==0) //左上边再下一子能构成活四 ||(r2-1<15&&c2-1>=0&&Arr[r2-1][c2-1]==0) ) //右下边再下一子可构成活四 LTHREE++; }else if(count==2 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((r1-1>=0&&c1-1>=0&&Arr[r1-1][c1-1]==Arr[R][C])&&(r1-2>=0&&c1-2>=0&&Arr[r1-2][c1-2]==0)) //左上边构成活三 ||((r2+1<15&&c2+1<15&&Arr[r2+1][c2+1]==Arr[R][C])&&(r2+2<15&&c2+2<150&&Arr[r2+2][c2+2]==0)) ) //右下边构成活三 LTHREE++; }else if(count==1 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((r1-1>=0&&c1-1>=0&&Arr[r1-1][c1-1]==Arr[R][C])&&(r1-2>=0&&c1-2>=0&&Arr[r1-2][c1-2]==Arr[R][C])&&(r1-3>=0&&c1-3>=0&&Arr[r1-3][c1-3]==0)) //左上边构成活三 ||((r2+1<15&&c2+1<15&&Arr[r2+1][c2+1]==Arr[R][C])&&(r2+2<15&&c2+2<15&&Arr[r2+2][c2+2]==Arr[R][C])&&(r2+3<15&&c2+3<15&&Arr[r2+3][c2+3]==0)) ) //右下边构成活三 LTHREE++; } //斜右 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==3 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( (r1-1>=0&&c1+1<15&&Arr[r1-1][c1+1]==0) //右上边再下一子能构成活四 ||(r2+1<15&&c2-1>=0&&Arr[r2+1][c2-1]==0) ) //左下边再下一子可构成活四 LTHREE++; }else if(count==2 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((r1-1>=0&&c1+1<15&&Arr[r1-1][c1+1]==Arr[R][C])&&(r1-2>=0&&c1+2<15&&Arr[r1-2][c1+2]==0)) //右上边构成活三 ||((r2+1<15&&c2-1>=0&&Arr[r2+1][c2-1]==Arr[R][C])&&(r2+2<15&&c2-2>=0&&Arr[r2+2][c2-2]==0)) ) //左下边构成活三 LTHREE++; }else if(count==1 &&Arr[r1][c1]==0 &&Arr[r2][c2]==0) { if( ((r1-1>=0&&c1+1<15&&Arr[r1-1][c1+1]==Arr[R][C])&&(r1-2>=0&&c1+2<15&&Arr[r1-2][c1+2]==Arr[R][C])&&(r1-3>=0&&c1+3<15&&Arr[r1-3][c1+3]==0)) //右上边构成活三 ||((r2+1<15&&c2-1>=0&&Arr[r2+1][c2-1]==Arr[R][C])&&(r2+2<15&&c2-2>=0&&Arr[r2+2][c2-2]==Arr[R][C])&&(r2+3<15&&c2-3>=0&&Arr[r2+3][c2-3]==0)) ) //左下边构成活三 LTHREE++; } if(LTHREE>=1) printf("Yes\n"); else printf("No\n"); return 0; }