| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3779 人关注过本帖
标题:C 自动判断五子棋胜负的程序
只看楼主 加入收藏
公子小白2
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-24
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:7 
C 自动判断五子棋胜负的程序
从前有一天,ly与lyon在讨论人工智能里面的好,他们提到了五子棋。
当然,这里说的五子棋是指无禁手(不知道什么是禁手的也不用管了,跟这题没关系)的五子棋:
    黑先下,黑白轮流下,最先在横竖斜任一方向上形成连续的5个子(或以上)就算赢。

    对此,ly和lyon都有自己的一套判断局势的算法,并且根据自己的想法各写了一个判断局况的程序。然而,他们都觉得自己的程序要比对方的优秀,所以,
他们稍作改良,做成了自动决策的对局程序,并拿出来互相pk。目前需要一个自动判断胜负的程序,即最先出现5连子的判胜。


输入格式
    第1行输入两个数n和m,用空格分开,n为棋盘横纵坐标的最大值,m为步数:
1<=n<=1000,0<m<=n*n
    第2行到第m+1行为第一步到第m步的坐标,每行两个数,用空格分开:
x和y,1<=x,y<=n
    输入保证不存在重复下子。

(出题人LRC)

输出格式
    输出首次分出胜负那一步的序号(第一步为1),如果走完了都没有分出胜负,输出“baga”。
输入样例
5 11
3 3
2 3
2 4
4 3
4 2
3 4
1 5
3 2
5 1
1 1
1 2

输出样例
9
#include<stdio.h>
int main(void)
{
    int n,k,j,t,a1=0,b1=0,flag=0;
    int m,i;
    int a[1000],b[1000];
    int c[1000][1000];
    scanf("%d%d",&n,&m);
    for(t=1;t<=n;t++)
    for(j=1;j<=n;j++)
    c[t][j]=0;
    for(i=1;i<=m;i++)
    scanf("%d%d",&a[i],&b[i]);
   
   for(i=1;i<=m;i++)
    {
    if(i%2!=0)
    {   a1=a[i];b1=b[i];c[a1][b1]=1;   }//黑棋置为1;
    else if(i%2==0)
    {   a1=a[i];b1=b[i];c[a1][b1]=2;   }//白棋置为2

            //判断五子是否在横线上
        if((c[a1][b1]==1&&c[a1+1][b1]==1&&c[a1+2][b1]==1&&c[a1+3][b1]==1&&c[a1+4][b1]==1)||
           (c[a1][b1]==2&&c[a1+1][b1]==2&&c[a1+2][b1]==2&&c[a1+3][b1]==2&&c[a1+4][b1]==2)||
           (c[a1][b1]==1&&c[a1-1][b1]==1&&c[a1+1][b1]==1&&c[a1+2][b1]==1&&c[a1+3][b1]==1)||
           (c[a1][b1]==2&&c[a1-1][b1]==2&&c[a1+1][b1]==2&&c[a1+2][b1]==2&&c[a1+3][b1]==2)||
           (c[a1][b1]==1&&c[a1-2][b1]==1&&c[a1-1][b1]==1&&c[a1+1][b1]==1&&c[a1+2][b1]==1)||
           (c[a1][b1]==2&&c[a1-2][b1]==2&&c[a1-1][b1]==2&&c[a1+1][b1]==2&&c[a1+2][b1]==2)||
           (c[a1][b1]==1&&c[a1-3][b1]==1&&c[a1-2][b1]==1&&c[a1-1][b1]==1&&c[a1+1][b1]==1)||
           (c[a1][b1]==2&&c[a1-3][b1]==2&&c[a1-2][b1]==2&&c[a1-1][b1]==2&&c[a1+1][b1]==2)||
           (c[a1][b1]==1&&c[a1-1][b1]==1&&c[a1-2][b1]==1&&c[a1-3][b1]==1&&c[a1-4][b1]==1)||
           (c[a1][b1]==2&&c[a1-1][b1]==2&&c[a1-2][b1]==2&&c[a1-3][b1]==2&&c[a1-4][b1]==2))
       {flag=1; break;}
        //判断五子是否在竖线上
        else if((c[a1][b1]==1&&c[a1][b1+1]==1&&c[a1][b1+2]==1&&c[a1][b1+3]==1&&c[a1][b1+4]==1)||
                (c[a1][b1]==2&&c[a1][b1+1]==2&&c[a1][b1+2]==2&&c[a1][b1+3]==2&&c[a1][b1+4]==2)||
                (c[a1][b1]==1&&c[a1][b1-1]==1&&c[a1][b1+1]==1&&c[a1][b1+2]==1&&c[a1][b1+3]==1)||
                (c[a1][b1]==2&&c[a1][b1-1]==2&&c[a1][b1+1]==2&&c[a1][b1+2]==2&&c[a1][b1+3]==2)||
                (c[a1][b1]==1&&c[a1][b1+1]==1&&c[a1][b1+2]==1&&c[a1][b1-1]==1&&c[a1][b1-2]==1)||
                (c[a1][b1]==2&&c[a1][b1+1]==2&&c[a1][b1+2]==2&&c[a1][b1-1]==2&&c[a1][b1-2]==2)||
                (c[a1][b1]==1&&c[a1][b1+1]==1&&c[a1][b1-1]==1&&c[a1][b1-2]==1&&c[a1][b1-3]==1)||
                (c[a1][b1]==2&&c[a1][b1+1]==2&&c[a1][b1-1]==2&&c[a1][b1-2]==2&&c[a1][b1-3]==2)||
                (c[a1][b1]==1&&c[a1][b1-1]==1&&c[a1][b1-2]==1&&c[a1][b1-3]==1&&c[a1][b1-4]==1)||
                (c[a1][b1]==2&&c[a1][b1-1]==2&&c[a1][b1-2]==2&&c[a1][b1-3]==2&&c[a1][b1-4]==2))
        {flag=1;break;}
    //判断五子是否在斜线上即 \
        else if((c[a1][b1]==1&&c[a1+1][b1+1]==1&&c[a1+2][b1+2]==1&&c[a1+3][b1+3]==1&&c[a1+4][b1+4]==1)||
                (c[a1][b1]==2&&c[a1+1][b1+1]==2&&c[a1+2][b1+2]==2&&c[a1+3][b1+3]==2&&c[a1+4][b1+4]==2)||
                (c[a1][b1]==1&&c[a1-1][b1-1]==1&&c[a1+1][b1+1]==1&&c[a1+2][b1+2]==1&&c[a1+3][b1+3]==1)||
                (c[a1][b1]==2&&c[a1-1][b1-1]==2&&c[a1+1][b1+1]==2&&c[a1+2][b1+2]==2&&c[a1+3][b1+3]==2)||
                (c[a1][b1]==1&&c[a1+1][b1+1]==1&&c[a1+2][b1+2]==1&&c[a1-1][b1-1]==1&&c[a1-2][b1-2]==1)||
                (c[a1][b1]==2&&c[a1+1][b1+1]==2&&c[a1+2][b1+2]==2&&c[a1-1][b1-1]==2&&c[a1-2][b1-2]==2)||
                (c[a1][b1]==1&&c[a1+1][b1+1]==1&&c[a1-1][b1-1]==1&&c[a1-2][b1-2]==1&&c[a1-3][b1-3]==1)||
                (c[a1][b1]==2&&c[a1+1][b1+1]==2&&c[a1-1][b1-1]==2&&c[a1-2][b1-2]==2&&c[a1-3][b1-3]==2)||
                (c[a1][b1]==1&&c[a1-1][b1-1]==1&&c[a1-2][b1-2]==1&&c[a1-3][b1-3]==1&&c[a1-4][b1-4]==1)||
                (c[a1][b1]==2&&c[a1-1][b1-1]==2&&c[a1-2][b1-2]==2&&c[a1-3][b1-3]==2&&c[a1-4][b1-4]==2))
        {flag=1;break;}
        //判断五子是否在斜线上即 /
        else if((c[a1][b1]==1&&c[a1+1][b1-1]==1&&c[a1+2][b1-2]==1&&c[a1+3][b1-3]==1&&c[a1+4][b1-4]==1)||
                (c[a1][b1]==2&&c[a1+1][b1-1]==2&&c[a1+2][b1-2]==2&&c[a1+3][b1-3]==2&&c[a1+4][b1-4]==2)||
                (c[a1][b1]==1&&c[a1-1][b1+1]==1&&c[a1+1][b1-1]==1&&c[a1+2][b1-2]==1&&c[a1+3][b1-3]==1)||
                (c[a1][b1]==2&&c[a1-1][b1+1]==2&&c[a1+1][b1-1]==2&&c[a1+2][b1-2]==2&&c[a1+3][b1-3]==2)||
                (c[a1][b1]==1&&c[a1+1][b1-1]==1&&c[a1+2][b1-2]==1&&c[a1-1][b1+1]==1&&c[a1-2][b1+2]==1)||
                (c[a1][b1]==2&&c[a1+1][b1-1]==2&&c[a1+2][b1-2]==2&&c[a1-1][b1+1]==2&&c[a1-2][b1+2]==2)||
                (c[a1][b1]==1&&c[a1+1][b1-1]==1&&c[a1-1][b1+1]==1&&c[a1-2][b1+2]==1&&c[a1-3][b1+3]==1)||
                (c[a1][b1]==2&&c[a1+1][b1-1]==2&&c[a1-1][b1+1]==2&&c[a1-2][b1+2]==2&&c[a1-3][b1+3]==2)||
                (c[a1][b1]==1&&c[a1-1][b1+1]==1&&c[a1-2][b1+2]==1&&c[a1-3][b1+3]==1&&c[a1-4][b1+4]==1)||
                (c[a1][b1]==2&&c[a1-1][b1+1]==2&&c[a1-2][b1+2]==2&&c[a1-3][b1+3]==2&&c[a1-4][b1+4]==2))
        {flag=1;break;}
}
    if(flag==1)
    printf("%d",i);
    else printf("baga");
    return 0;
}
//////////哪位大神能帮我看下,我拜他为师!!!为什么无法编译

[ 本帖最后由 公子小白2 于 2012-12-9 22:35 编辑 ]
搜索更多相关主题的帖子: 人工智能 
2012-12-09 21:47
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:7 
请把
//判断五子是否在斜线上即 \
后面的‘\’去掉,或者换成‘/’
别问我为什么,我也不知道


[fly]存在即是合理[/fly]
2012-12-09 22:56
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
我的插件告诉我,‘\’把下一行变成了注释,编译器判定不编译下一行


[fly]存在即是合理[/fly]
2012-12-09 23:04
公子小白2
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-24
收藏
得分:0 
回复 3楼 azzbcc
'/'   '\'是我写的注释,补上的
2012-12-10 12:38
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
去掉试试,嘿嘿,这种现象不懂,好坑!


[fly]存在即是合理[/fly]
2012-12-10 12:48
heishu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:42
专家分:131
注 册:2012-9-7
收藏
得分:7 
//判断五子是否在横线上
         if((c[a1][b1]==1&&c[a1+1][b1]==1&&c[a1+2][b1]==1&&c[a1+3][b1]==1&&c[a1+4][b1]==1)||
貌似少了 else
初步目测这里 c[1000][1000]没初始化
有时间我会编译一下


[ 本帖最后由 heishu 于 2012-12-10 16:36 编辑 ]

[qq]1402050187[/qq]
2012-12-10 16:19
公子小白2
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-24
收藏
得分:0 
回复 6楼 heishu
for(t=1;t<=n;t++)
    for(j=1;j<=n;j++)
    c[t][j]=0;
就已经初始化了
2012-12-10 19:14
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:7 
具体我没怎么看,不过这里好像有点问题:
程序代码:
 for(t=1;t<=n;t++)   /*这里把t和j都初始化为1,可是数组需要考虑索引值*/
    for(j=1;j<=n;j++)
    c[t][j]=0;   //c[0][n]这一行全没有初始化,因为t初始化为1*/

for(t=1;t<n;t++)
for(j=0;j<n;j++)
c[t][j] = 0;
这里是一个错误,其他地方有没有我就不知道了,先试试吧


I have not failed completely
2012-12-10 19:30
快速回复:C 自动判断五子棋胜负的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023559 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved