poj 1414 dfs 搜索

给一个正三角形, 可以在任意一个 0 的地方填上数字 c   ,填完之后计算出得分的最大值。

计算得分的规则:

 相同数字的连通的集合  如果和某个0连通,就忽略了。

 如果没有和0连通,分2种情况: 如果这个数字是c 则得分减去 这个集合中数字的个数,否则加上。

#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
int mov[6][2]={{0,-1},{0,1},{-1,-1},{-1,0},{1,0},{1,1}};
int flag,n,c,vis[11][11],d[20][20],res;
int ok(int x,int y)
{
	if(x>=1&&x<=n&&y>=1&&y<=x)
	return 1;
	else
	return 0;
}
int dfs(int x,int y,int sym) // 计算  数字sym连通集合中该数字的个数
{
	vis[x][y]=1;
	int step=1;
	for(int i=0;i<6;i++)
	{
		int x1=x+mov[i][0];
		int y1=y+mov[i][1];
		if(ok(x1,y1)&&!vis[x1][y1])
		{
			if(d[x1][y1]==sym)
			step+=dfs(x1,y1,sym);
			if(d[x1][y1]==0)
			flag=1;
		}
	}
	return step;
}
void solve()
{
	res=-10000;
	for(int i=1;i<=n;i++)//枚举每一个可以放c的地方
	for(int j=1;j<=i;j++)
	{
		if(d[i][j]==0)
		{
			int ans=0,tem;
			d[i][j]=c;
			memset(vis,0,sizeof(vis));
			for(int k=1;k<=n;k++)
			for(int p=1;p<=k;p++)
			{
				if(vis[k][p]||d[k][p]==0)
				continue;
				flag=0;
				tem=dfs(k,p,d[k][p]);
				if(!flag)
				{
					if(d[k][p]==c)
					ans-=tem;
					else
					ans+=tem;
				}
			}
			d[i][j]=0;
			res=MAX(res,ans);
		}
	}
}
int main()
{
	while(~scanf("%d%d",&n,&c)&&(n+c))
	{
		for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
		scanf("%d",&d[i][j]);
		solve();
		printf("%d\n",res);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值