五子棋(活三)

时限: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;
}

 

 

posted on 2012-07-10 13:10  IThinktan  阅读(3062)  评论(0编辑  收藏  举报

导航