zoukankan      html  css  js  c++  java
  • 五子棋(活三)

    时限: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;
    }
  • 相关阅读:
    孩子们的游戏(圆圈中最后剩下的数)
    求1+2+3+...+n
    扑克牌顺子
    Java 好文整理
    翻转单词顺序列
    左旋转字符串
    和为S的两个数字
    和为S的连续正数序列
    平衡二叉树
    java 构造函数
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2584455.html
Copyright © 2011-2022 走看看