BUAA_数据结构_2nd_五子棋危险判断

BUAA_数据结构_2nd_五子棋危险判断

问题描述

已知两人分别执白棋和黑棋在一个围棋棋盘上下五子棋,若同一颜色的棋子在同一条横行、纵行或斜线上连成5个棋子,则执该颜色棋子的人获胜。编写程序读入某一时刻下棋的状态,并判断是否有人即将获胜,即:同一颜色的棋子在同一条横行、纵列或斜线上连成4个棋子,且该4个棋子的两端至少有一端为空位置。
输入的棋盘大小是19×19,用数字0表示空位置(即没有棋子),用数字1表示该位置下了一白色棋子,用数字2表示该位置下了一黑色棋子。假设同一颜色的棋子在同一条横行、纵列或斜线上连成的棋子个数不会超过4个,并且最多有一人连成线的棋子个数为4。

输入形式

从控制台输入用来表示棋盘状态的数字0、1或2;每行输入19个数字,各数字之间以一个空格分隔,每行最后一个数字后没有空格;共输入19行表示棋盘状态的数字。

输出形式

若有人即将获胜,则先输出即将获胜人的棋子颜色(1表示白色棋子,2表示黑色棋子),然后输出英文冒号:,最后输出连成4个棋子连线的起始位置(棋盘横行自上往下、纵列自左往右从1开始计数,横行最小的棋子在棋盘上的横行数和纵列数作为连线的起始位置,若在同一行上,则纵列数最小的棋子位置作为起始位置,两数字之间以一个英文逗号,作为分隔符)。
若没有人获胜,则输出英文字符串:No。
无论输出什么结果,最后都要有回车换行符。

参考代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[21][21];
typedef struct map_find{
    int type;//1 or 2
    int x;//start.x
    int y;//start.y
}go;
go res;
int find(int x,int y);
int legal(int x,int y);
int equal(int x1,int y1,int x2,int y2);

int left(int x,int y);
int left_top(int x,int y);
int top(int x,int y);
int right_top(int x,int y);
int right(int x,int y);
int right_bottom(int x,int y);
int bottom(int x,int y);
int left_bottom(int x,int y);

int main()
{
    for(int i=0;i<21;i++){
        map[i][0]=-1;
        map[0][i]=-1;
        map[i][20]=-1;
        map[20][i]=-1;
    }
    for(int i=1;i<20;i++){
        for(int j=1;j<20;j++){
            scanf("%d",&map[i][j]);
        }
    }
    for(int i=1;i<20;i++){
        for(int j=1;j<20;j++){
            int x=find(i,j);
            if(x==1){
                printf("%d:%d,%d\n",res.type,res.x,res.y);
                return 0;
            }
        }
    }
    printf("No\n");
    return 0;
}

int legal(int x,int y)
{
    if(map[x,y]==-1) return 0;
    else return 1;
}

int equal(int x1,int y1,int x2,int y2)
{
    if(map[x1][y1]==map[x2][y2]&&map[x1][y1]!=0) return 1;
    else return 0;
}

int blank(int x,int y)
{
    if(map[x][y]==0) return 1;
    else return 0;
}

int left(int x,int y)
{
    if(legal(x,y-1)){
        if(equal(x,y,x,y-1)){
            if(legal(x,y-2)){
                if(equal(x,y,x,y-2)){
                    if(legal(x,y-3)){
                        if(equal(x,y,x,y-3)){
                            if(blank(x,y-4)||blank(x,y+1)){
                                res.type=map[x][y];
                                res.x=x-3;
                                res.y=y;
                                return 1;
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

int left_top(int x,int y)
{
    if(legal(x-1,y-1)){
        if(equal(x,y,x-1,y-1)){
            if(legal(x-2,y-2)){
                if(equal(x,y,x-2,y-2)){
                    if(legal(x-3,y-3)){
                        if(equal(x,y,x-3,y-3)){
                            if(blank(x-4,y-4)||blank(x+1,y+1)){
                                res.type=map[x][y];
                                res.x=x-3;
                                res.y=y-3;
                                return 1;
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

int top(int x,int y)
{
    if(legal(x-1,y)){
        if(equal(x,y,x-1,y)){
            if(legal(x-2,y)){
                if(equal(x,y,x-2,y)){
                    if(legal(x-3,y)){
                        if(equal(x,y,x-3,y)){
                            if(blank(x-4,y)||blank(x+1,y)){
                                res.type=map[x][y];
                                res.x=x-3;
                                res.y=y;
                                return 1;
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

int right_top(int x,int y)
{
    if(legal(x-1,y+1)){
        if(equal(x,y,x-1,y+1)){
            if(legal(x-2,y+2)){
                if(equal(x,y,x-2,y+2)){
                    if(legal(x-3,y+3)){
                        if(equal(x,y,x-3,y+3)){
                            if(blank(x-4,y+4)||blank(x+1,y-1)){
                                res.type=map[x][y];
                                res.x=x-3;
                                res.y=y;
                                return 1;
                            }

                        }
                    }
                }
            }
        }
    }
    return 0;
}

int right(int x,int y)
{
    if(legal(x,y+1)){
        if(equal(x,y,x,y+1)){
            if(legal(x,y+2)){
                if(equal(x,y,x,y+2)){
                    if(legal(x,y+3)){
                        if(equal(x,y,x,y+3)){
                            if(blank(x,y+4)||blank(x,y-1)){
                                res.type=map[x][y];
                                res.x=x;
                                res.y=y;
                                return 1;
                            }

                        }
                    }
                }
            }
        }
    }
    return 0;
}

int right_bottom(int x,int y)
{
    if(legal(x+1,y+1)){
        if(equal(x,y,x+1,y+1)){
            if(legal(x+2,y+2)){
                if(equal(x,y,x+2,y+2)){
                    if(legal(x+3,y+3)){
                        if(equal(x,y,x+3,y+3)){
                            if(blank(x+4,y+4)||blank(x-1,y-1)){
                                res.type=map[x][y];
                                res.x=x;
                                res.y=y;
                                return 1;
                            }

                        }
                    }
                }
            }
        }
    }
    return 0;
}

int bottom(int x,int y)
{
    if(legal(x+1,y)){
        if(equal(x,y,x+1,y)){
            if(legal(x+2,y)){
                if(equal(x,y,x+2,y)){
                    if(legal(x+3,y)){
                        if(equal(x,y,x+3,y)){
                            if(blank(x+4,y)||blank(x-1,y)){
                                res.type=map[x][y];
                                res.x=x;
                                res.y=y;
                                return 1;
                            }

                        }
                    }
                }
            }
        }
    }
    return 0;
}

int left_bottom(int x,int y)
{
    if(legal(x+1,y-1)){
        if(equal(x,y,x+1,y-1)){
            if(legal(x+2,y-2)){
                if(equal(x,y,x+2,y-2)){
                    if(legal(x+3,y-3)){
                        if(equal(x,y,x+3,y-3)){
                            if(blank(x+4,y-4)||blank(x-1,y+1)){
                                res.type=map[x][y];
                                res.x=x;
                                res.y=y;
                                return 1;
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

int find(int x,int y)
{
    if(left(x,y)||left_top(x,y)||top(x,y)||right_top(x,y))
        return 1;
    else if(right(x,y)||right_bottom(x,y)||bottom(x,y)||left_bottom(x,y))
        return 1;
    else
        return 0;
}

有问题或bug 欢迎私戳/评论

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值