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;
}