用一个C语言程序评判五子棋胜负(非人工智能),总是不过,求解

11155 ly与lyon的终极巅峰对决
时间限制:1000MS 内存限制:65535K
提交次数:566 通过次数:130

题型: 编程题 语言: G++;GCC
Description
从前有一天,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>
#include<string.h>
int a[1001][1001]={0};
int is_win(int i,int j,int z)
{
    int count=0,flag=0,n,k,o,p;
    for(n=i-4;n<=i;n++)
    {
        if(n<0)
            continue;
        count=0,flag=0;
        for(k=n;k<=5;k++)
        {
            if(k>z)
                break;
            if(a[k][j]) count++;
        }
        if(count==5) flag++;
        if(flag)
            return 1;
    }
    for(n=j-4;n<=j;n++)
    {
        if(n<0)
            continue;
        count=0,flag=0;
        for(k=n;k<=5;k++)
        {
            if(k>z)
                break;
            if(a[i][k]) count++;
        }
        if(count==5) flag++;
        if(flag)
            return 1;
    }
    for(n=i-4,k=j-4;n<=i,k<=j;n++,k++)
    {
        if(n<0||k<0)
            continue;
        count=0,flag=0;
        for(o=n,p=k;o<=5,p<=5;o++,p++)
        {
            if(o>z||p>z)
                break;
            if(a[o][p]) count++;
        }
        if(count==5) flag++;
        if(flag)
            return 1;
    }
    for(n=i+4,k=j-4;n>=i,k<=j;n--,k++)
    {
        if(n<0||k<0)
            continue;
        count=0,flag=0;
        for(o=n,p=k;o<=5,p<=5;o--,p++)
        {   
            if(o>z||p>z)
                break;
            if(a[o][p]) count++;
        }
        if(count==5) flag++;
        if(flag)
            return 1;
    }
    return 0;
}
int main()
{
    int n,m,count=0;
    int i,j;
    int flag=0,flag2=0;
    scanf("%d%d",&n,&m);
    while(scanf("%d%d",&i,&j)==2)
    {
        count++;
        if(count>m&&flag==0||n<5)
        {
            printf("baga");
            flag2++;
            break;
        }
        a[i][j]++;
        if(is_win(i,j,n)&&flag==0)
        {
            printf("%d\n",count);
            flag++;
        }
        if(count>=m&&flag>0)
            break;
    }
    return 0;
}

1个回答

gzdrn
gzdrn 谢谢回答,但我想知道我的算法错在哪了,oj上一直WA
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐