poj.1753dfs

博客内容探讨了POJ 1753题目,涉及矩阵翻转的问题。关键点在于理解每个点最多翻转一次,顺序不影响结果,求解最小翻转次数。文章提供了代码示例和测试数据。

这道题的意思很简单,主要需要注意的有两点,第一:矩阵中的每个点都最多被主动翻一次,(注意不是被动),所以总共有2^16种可能,只要枚举每种可能了。第二:翻转的顺序对结果没有影响,所以问题的关键就在于那些点被主动翻转了。翻转多少次就有多少次round,只要求出所有round中最小的一个就是答案了,如果没有一种可能可以得到结果则输出“Impossible"。下面是代码和测试数据:

//#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//using namespace std;
#define Inf 1000000
int maxn;
int s[4][4];
void Init(){
	char ch[4][4];
	int i,j;
	for(i=0;i<4;i++)
		scanf("%s",ch[i]);
	for(i=0;i<4;i++)
		for(j=0;j<4;j++){
			if(ch[i][j]=='b')
				s[i][j]=1;
			else
				s[i][j]=-1;
		}
		/*for(i=0;i<4;i++)
			for(j=0;j<4;j++)
             printf("%d ",s[i][j]);*/
}	
bool Is_right(int (*t)[4]){
	int i,j;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			if(t[i][j]!=t[0][0])
				return false;
			return true;
}			
void dfs(int (*t)[4],int x,int y,int deep){
	if(Is_right(t)){
		if(deep<maxn)
			maxn=deep;
		return ;
	}
	if(x>=4)
		return ;
	//int (*record)[4]=t;
	int record[4][4],i,j;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			record[i][j]=t[i][j];
		if(x>=0 && x<=3 && y>=0 && y<=3)
			record[x][y]=-record[x][y];
		if(x-1>=0 && x-1<=3 && y>=0 && y<=3)
			record[x-1][y]=-record[x-1][y];
		if(x+1>=0 && x+1<=3 && y>=0 && y<=3)
			record[x+1][y]=-record[x+1][y];
		if(x>=0 && x<=3 && y-1>=0 && y-1<=3)
			record[x][y-1]=-record[x][y-1];
		if(x>=0 && x<=3 && y+1>=0 && y+1<=3)
			record[x][y+1]=-record[x][y+1];
		if(y<=2){
			dfs(t,x,y+1,deep);
			dfs(record,x,y+1,deep+1);
		}
		else{
			dfs(t,x+1,0,deep);
			dfs(record,x+1,0,deep+1);
		}
}	
int main()
{
	//int i,j;
	while(true){
     Init();
    if(Is_right(s)){
		printf("0\n");
		continue;
		//return 0;
	}
	maxn=Inf;
	dfs(s,0,0,0);
	if(maxn==Inf){
		printf("Impossible\n");
		continue;
		//return 0;
	}
	printf("%d\n",maxn);
	}
	return 0;
}


bwbw
wwww
bbwb
bwwb


bwwb
bbwb
bwwb
bwww


wwww
wwww
wwww
wwww


bbbb
bbbb
bbbb
bbbb


bbbb
bwbb
bbbb
bbbb


bwbb
bwbb
bwbb
bbbb


bwbb
wwwb
bwbb
bbbb


wwww
wwwb
wwbb
wwwb


wwww
wwww
wwwb
wwbb


wbwb
bwbw
wbwb
bwbw


bbbb
bwwb
bwwb
bbbb


bwwb
wbbw
wbbw
bwwb


bbww
bbww
wwbb
wwbb


bbwb
bbbw
wwbb
wwwb


wwwb
wwbw
wbww
wwbw


bbbb
wwww
wwbb
wbbb

bwwb
wbwb
wbbb
wbbb


bwbb
bwbb
bwbw
bbbw


wbwb
bbbb
bbww
wbbb


bbwb
bbbb
wbwb
bbbb


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值