围棋

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
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,g,p,x1,y1,a[22][22],mov[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct input{
	int x,y;
}s[402];
void search(int ,int );
int main()
{
	//freopen("a.txt","r",stdin);
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int i,j,max=0,x2,y2;
		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)   //找到白棋的位置 
			{
				search(i,j);
				if(p==1)    //判断白棋周围的空格是否只有一个 
				{
					if(max<g||max==g&&y1<y2||max==g&&y1==y2&&n-x1+1<n-x2+1)  //找出最优解 
					{
						max=g; 
					    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;
}
void search(int x,int y)
{
	int head=0,tail=1,first=1;
	s[1].x=x; s[1].y=y; a[x][y]=1; p=0; g=1;
	while(head<tail)
	{
		head++;
		for(int i=0;i<4;i++)
	    {
			x=s[head].x+mov[i][0]; y=s[head].y+mov[i][1];
			if(a[x][y]==0&&p<2&&x>0&&x<=n&&y>0&&y<=m)
			if(first) {first=0; x1=x; y1=y; p++;}    //计算空格的个数及记录空格的位置 
			else if(x!=x1||y!=y1) p++;
			if(a[x][y]==-1&&x>0&&x<=n&&y>0&&y<=m)
			{
				g++; tail++;
				s[tail].x=x; s[tail].y=y;
				a[x][y]=1;
			}
			x=s[head].x-mov[i][0]; y=s[head].y-mov[i][1];
	    }
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是围棋学习v1.38版的升级版,免费使用。本软件采用易语言编写。 2009-5-31 围棋学习1.72版相对于1.66版更新说明:   1、增加了对局超出手数限制后的提示;   2、优化了对局计时功能;   3、在数目状态下禁用了主窗口菜单项“序号”;   4、调整了围棋入门知识介绍内容顺序;   5、调整了棋盘底图大小。   6、修正了显示数目结果文本时的闪烁问题。 2009-5-24 围棋学习1.66版相对于1.53版更新说明: 从功能上说,主要有以下改进:   1、增强了数目功能使之实用化;   2、在“帮助”菜单栏下面增加了围棋入门知识介绍;   3、在“设置”菜单栏下面增加了文件关联设置。   从设计上说,主要作了以下修改:   1、对“类_基础智能”、“类_局面”的修改:   (1)重命名私有成员“私_棋子分布”为“私_棋子类型分布”;   (2)重命名私有成员“私_标志分布”为“私_棋子标志分布”。 2、对“类_数目”的修改:   (1)重命名私有成员“私_棋子分布”为“私_棋子类型分布”;   (2)重命名私有成员“私_标志分布”为“私_棋子标志分布”;  (3)增加私有成员“私_棋子归属分布”,数型类型为整数型;   (4)增加了私有成员“私_局目设置”,数据类型为新增的自定义数据类型“自定义_局目设置”; (5)增加了方法“取首次数目结果”和“取再次数目结果”; (6)进一步修正了各比赛规则对应的数目结果。   3、对“类_盘面”的修改:   (1)重命名私有成员“私_棋子分布”为“私_棋子类型分布”;   (2)增加私有成员“私_棋子归属分布”,数型类型为整数型;   (3)增加了方法“重绘盘面数目”。   4、其他对相关常量、方法、子程序、主窗口界面的优化、增改不再一一列举。 2009-5-10 围棋学习1.53版相对于1.50版更新说明:   1、对“类_基础智能”、“类_局面”、“类_数目”的修改:   (1)修改了私有成员“私_棋子分布”和“私_标志分布”的数据类型为字节型;   (2)多处修改了相关方法。   2、对“主窗口程序集”的修改:   (1)增加了程序集变量“集_对局控制”,直接记录对局状态和再现状态;   (2)多处修改了相关子程序和常量。 2009-5-7 围棋学习1.50版相对于1.43版更新说明:   1、对“类_基础智能”、“类_局面”、“类_数目”的修改:   (1)增加了私有成员“私_标志分布”;   (2)多处修改了相关方法。   2、对“类_数目”的修改:   (1)增加了私有成员“私_点目设置”,数据类型为新增的自定义数据类型“自定义_点目设置”;   (2)多处修改了相关方法。 2009-5-6 围棋学习1.43版相对于1.38版更新说明:   1、对“类_基础智能”的修改:   (1)修改了方法“基础推算_我方下于本处一手断开对方两块棋判断”;   (2)增加了方法“基础推算_本处相邻某类棋子成对夹判断”;   (3)修改了方法“基础计算_下子判断”;   (4)增加了方法“基础计算_本处下子被提子判断”;   (5)增加了方法“基础计算_本处下子提子判断”; (6)删除了方法“基础计算_被提子判断1”,并将其功能分成两个方法:“基础计算_取被提子数”和“基础计算_取棋子串周围空点”; (7)重命名方法“基础计算_被提子判断2”为“基础计算_被提子判断1”; (8)重命名方法“基础计算_被提子判断3”为“基础计算_被提子判断2”;   2、对“类_局面”的修改:   (1)修改了方法“下子判断”;   (2)增加了方法“本处下子被提子判断”;   (3)增加了方法“本处下子提子判断”; (4)重命名方法“被提子判断1”为“取被提子数”; (5)重命名方法“被提子判断2”为“被提子判断1”; (6)重命名方法“被提子判断3”为“被提子判断2”;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值