題目鏈接:點擊打開鏈接
題目大意爲給出一個4*4的圖,由+,-兩種符號構成,反轉一次可以將其所在行和列都換爲另一種符號,求反轉多少次可以使符號全變成+,輸出次數和翻轉的座標。
ps:這個題和poj1753差不多,只要會保存路徑就好了。
//164K 672MS
//C++ 1230B
#include <cstdio>
int step,flag;
char map[4][4];
struct node
{
int x,y;
}dis[17];
void turn (int i,int j)
{
int a;
map[i][j]=!map[i][j];
for(a=0;a<4;a++)
{
map[a][j]=!map[a][j];
map[i][a]=!map[i][a];
}
}
int judge()
{
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(map[i][j])
return 0;
}
}
return 1;
}
void dfs(int i,int j,int dp)
{
if(dp==step)
{
flag=judge();
return;
}
if(flag||i==4) return;
dis[dp].x=i+1;
dis[dp].y=j+1;
turn(i,j);
if(j<3)
dfs(i,j+1,dp+1);
else
dfs(i+1,0,dp+1);
turn(i,j);
if(j<3)
dfs(i,j+1,dp);
else
dfs(i+1,0,dp);
return;
}
int main()
{
int i,j;
char c;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%c",&c);
if(c=='+') map[i][j]=1;
else map[i][j]=0;
}
getchar();
}
for(step=0;step<=16;step++)
{
flag=0;
dfs(0,0,0);
if(flag)
break;
}
printf("%d\n",step);
for(i=0;i<step;i++)
{
printf("%d %d\n",dis[i].x,dis[i].y);
}
return 0;
}