1815:画家问题 C

描述

有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。

02110523_c221.jpg

输入

第一行是一个整数n (1≤n ≤15),表示墙的大小。接下来的n行表示墙的初始状态。每一行包含n个字符。第i行的第j个字符表示位于位置(i,j)上的砖的颜色。“w”表示白砖,“y”表示黄砖。

输出

一行,如果Bob能够将所有的砖都涂成黄色,则输出最少需要涂画的砖数,否则输出“inf”。

样例输入

5
wwwww
wwwww
wwwww
wwwww
wwwww

样例输出

15

——————————————————————分割线————————————————————

源代码

#include<stdio.h>
int puzzle[20][20];
int press[20][20];
int n;
int ans;
int p=1;
bool guess()
	{
	int i,j;
	for(i=2;i<=n;i++)
	for(j=1;j<=n;j++)
	press[i][j]=(puzzle[i-1][j]+press[i-1][j-1]+press[i-1][j]+press[i-1][j+1]+press[i-2][j])%2;
	for(j=1;j<=n;j++)
	if(press[n][j]!=(puzzle[n][j]+press[n][j-1]+press[n][j+1]+press[n-1][j])%2)
	return true;
	return false;
	}
	void solve()
		{
		for(c=1;c<=n;c++)
		press[1][c]=0;
		while(guess())
			{
			if(p==5000)
			break;
			p++;
			press[1][1]++;
			c=1;
			while(press[1][c]>1)
				{
				press[1][c]=0;
				c++;
				press[1][c]++;
				}	
			}
		}
		int main()
			{
			int i,j;
			scanf("%d",&n);
			for(i=0;i<=n;i++)
			puzzle[i][0]=puzzle[i][n+1]=press[i][0]=press[i][n+1]=0;
			for(j=0;j<=n+1;j++)
			puzzle[0][j]=puzzle[n][j]=press[0][j]=press[n][j]=0;
			char c[20];
			int a=1;
			for(i=1;i<=n;i++)
				{
				scanf("%s",&c);
				for(j=0;j<=n-1;j++)
					{
					if(c[j]=='w')
						{
						puzzle[i][j+1]=1;
						a=0;
						}
						else
						puzzle[i][j+1]=0;
					}
				}
				if(a==0)	
				solve();
				for(i=1;i<=n;i++)
				for(j=1;j<=n;j++)
				if(press[i][j]==1)
				ans++;
				if(p==5000)
				printf("inf\n");
				else	
				printf("%d\n",ans);	
				return 0;
			}

 

转载于:https://my.oschina.net/u/3775929/blog/1617244

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值