Fliptile解题报告

原题链接:http://poj.org/problem?id=3279
解题思路:这题难度不算很大,只需要对第一排的情况进行枚举,接下来每行的情况就固定了,唯一可以讲的就是枚举的时候使用二进制枚举法来枚举第一行的所有情况。
二进制枚举的代码如下:

max=1<>1;	
		}

完整代码:

#include
#include
#define		inmap	for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d",&map[i][j]);	}	}
#define		inout	for(i=1;i<=n;i++){for(j=1;j<=m;j++){out[i][j]=b[i][j];	}	}
#define		outmap	for(i=1;i<=n;i++){printf("%d",out[i][1]);	for(j=2;j<=m;j++){printf(" %d",out[i][j]);	}	printf("\n");	}
#define		MAX		20
int vis[MAX][MAX],map[MAX][MAX],b[MAX][MAX],out[MAX][MAX],n,m,num,min;
void	change()
{
	int i,j,flag=0;
	for(i=2;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			if((map[i-1][j]+vis[i-1][j])%2==1)
			{
				vis[i+1][j]++;
				vis[i][j+1]++;
				vis[i][j]++;
				vis[i][j-1]++;
				b[i][j]=1;
				num++;
				if(num>min)
				{
					goto aa;
				}
			}
		}
	}
	for(j=1;j<=m;j++)
	{
		if((map[n][j]+vis[n][j])%2!=0)
		{
			flag=1;
			break;
		}
	}
aa:	if(flag==0&&min>num)
	{
		min=num;
		inout
	}	
}
void	judge()
{
	int t=1,i,j,a,max;
	min=226;
	max=1<>1;	
		}
		change();
		
	}
}
int main()
{
	int i,j;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		inmap
		judge();
		if(min==226)	printf("IMPOSSIBLE\n"); 
		else	outmap
	}
	return 0;
}

你可能感兴趣的:(Fliptile解题报告)