现在的位置: 首页 > 综合 > 正文

围棋

2015年12月27日 ⁄ 综合 ⁄ 共 1524字 ⁄ 字号 评论关闭

Problem Description

小tiger最近迷上了围棋。他对围棋围住对方的棋后能吃掉一大片感到很兴奋,于是整天研究轮到他走的某个局面一步最多能吃到多少棋子。不过这个围棋棋盘对小tiger来说实在太大了,为了更快地了解该怎么下棋,tiger找到了作为程序设计高手的你,帮他写一个判断吃子的程序,注意小tiger是先手执黑的。
这里简单介绍一下围棋的规则:棋盘上直线紧邻的点上如果有同色棋子存在,这些棋子就相互连接成一个不可分割的整体。直线紧邻的点上如果有异色棋子存在,此处的气便不存在。棋子如失去所有的气,就不能在棋盘上存在。如果某方下子后,对方棋子无气,或双方都呈无气状态,则应立即提取对方无气之子。

Input

输入有多组数据,每组数据的第1行为两个整数n,m(1<=n<=20,1<=m<=20)代表棋盘的大小。
下面n行每行m个整数,用空格隔开,代表现有的棋盘状态,只包括0,-1,1三个整数,分别代表该点被空格,白棋或黑棋占据。

Output

对于每组数据输出黑棋的最多吃子数与下该棋的坐标。默认左下角为(1,1),第一个数为横向,从左向右递增,第二个数为纵向,从下往上递增(即与二维坐标系相同)。如果有多个吃子数量相同的点,则以坐标X轴小者优先,再以Y轴小者优先。如果吃不了子,则输出一行“0 0 0”。

Sample Input

3 3
0 1 0
1 -1 0
0 1 0

Sample Output

1 3 2

Author

HYNU
#include<iostream>
#include<cstdio>
using namespace std;

int n,m,ans,cnt,x1,y1,a[22][22],mov[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

struct ok
{
    int x,y;
}p[402];

void dfs(int x,int y)
{
    int head=0,tail=1,first=1;
    p[1].x=x;
	p[1].y=y;
	a[x][y]=1;
	cnt=0;
	ans=1;
    while(head<tail)
    {
        head++;
        for(int i=0;i<4;i++)
        {
            x=p[head].x+mov[i][0];
	    y=p[head].y+mov[i][1];
            if(a[x][y]==0&&cnt<2&&x>0&&x<=n&&y>0&&y<=m)
	    {
		if(first)
		{
			first=0;
			x1=x;
			y1=y;
			cnt++;
		}
		else if(x!=x1||y!=y1) cnt++;
	    }
	    if(cnt>2)    break;
            if(a[x][y]==-1&&x>0&&x<=n&&y>0&&y<=m)
            {
                ans++;
                p[++tail].x=x;
		p[tail].y=y;
                a[x][y]=1;
            }
        }
    }
}

int main()
{
    freopen("a.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int i,j,max=0,x2=25,y2=25;
        for(i=1;i<=n;i++)    //存储数据;
	for(j=1;j<=m;j++)
	    scanf("%d",&a[i][j]);
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
	{
	    if(a[i][j]==-1)    //如果是白棋,那么进行搜索;
	    {
		dfs(i,j);
		if(cnt==1)
		{
		    if(max<ans||max==ans&&y1<y2||max==ans&&y1==y2&&n-x1+1<n-x2+1)
		    {
			max=ans;
			x2=x1;
			y2=y1;
		    }
		}
	    }
	}
        if(max==0) printf("0 0 0\n");
	else    printf("%d %d %d\n",max,y2,n-x2+1);
    }
    return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.