五子棋(活四)

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

 

转载于:https://www.cnblogs.com/IThaitian/archive/2012/07/10/2584452.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值