这道题的意思很简单,主要需要注意的有两点,第一:矩阵中的每个点都最多被主动翻一次,(注意不是被动),所以总共有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
博客内容探讨了POJ 1753题目,涉及矩阵翻转的问题。关键点在于理解每个点最多翻转一次,顺序不影响结果,求解最小翻转次数。文章提供了代码示例和测试数据。
1万+

被折叠的 条评论
为什么被折叠?



