• 五子棋(活三)


    时限: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;
    }
  • 相关阅读:
    Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
    ubuntu 关闭显示器的命令
    ubuntu android studio kvm
    ubuntu 14.04版本更改文件夹背景色为草绿色
    ubuntu 创建桌面快捷方式
    Ubuntu 如何更改用户密码
    ubuntu 14.04 返回到经典桌面方法
    ubuntu 信使(iptux) 创建桌面快捷方式
    Eclipse failed to get the required ADT version number from the sdk
    Eclipse '<>' operator is not allowed for source level below 1.7
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2584455.html
Copyright © 2020-2023  润新知