同样是一道枚举题,但是自己过不去,代码的掌控能力不太好。。。
#include<stdio.h>
#include<string.h>
bool map[5][5];
int vis[5][5];
int flag;
int step;
void cha(int x,int y)
{
for(int i=1; i<5; i++)
map[i][y]=!map[i][y];
for(int i=1; i<5; i++)
map[x][i]=!map[x][i];
map[x][y]=!map[x][y];
}
bool pd()
{
for(int i=1; i<5; i++)
for(int j=1; j<5; j++)
if(map[i][j]!=true)
return false;
return true;
}
void dfs(int x,int y,int deep)
{
if(deep==step)
{
flag=pd();
return ;
}
if(x>=5)
return ;
cha(x,y);
vis[x][y]=1;
if(y<4)
dfs(x,y+1,deep+1);
else
dfs(x+1,1,deep+1);
if(flag)
return ;
cha(x,y);
vis[x][y]=0;
if(x<4)
dfs(x,y+1,deep);
else
dfs(x+1,1,deep);
if(flag)
return ;
}
int main()
{
char c;
for(int i=1; i<5; i++)
{
for(int j=1; j<5; j++)
{
scanf("%c",&c);
if(c=='-')
map[i][j]=true;
else
map[i][j]=false;
}
getchar();
}
int i;
for(i=1; i<=16; i++)
{
step=16;
memset(vis,0,sizeof(vis));
dfs(1,1,0);
if(flag)
break;
}
printf("%d\n",step);
for(int i=1; i<5; i++)
for(int j=1; j<5; j++)
if(!vis[i][j])
printf("%d %d\n",i,j);
return 0;
}
借鉴了别人的代码,还有一种思路为:
在数据中如果存在一个‘+’ 则所在行、列分别自加一,最后统计奇数的个数即可,便为最后需要翻转个数。。。
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
bool mark[4][4];
char s[4][4];
int is[16];
int js[16];
int main()
{
memset(mark,0,sizeof(mark));
for(int i=0; i<4; i++)
cin>>s[i];
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
if(s[i][j]=='+')
{
mark[i][j]=!mark[i][j];
for(int k=0; k<4; k++)
{
mark[i][k]=!mark[i][k];
mark[k][j]=!mark[k][j];
}
}
}
}
int count=0;
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
if(mark[i][j])
{
is[count]=i+1;
js[count]=j+1;
count++;
}
}
}
cout<<count<<endl;
for(int i=0; i<count; i++)
{
cout<<is[i]<<" "<<js[i]<<endl;
}
return 0;
};