POJ2965-The Pilots Brothers' refrigerator

題目鏈接:點擊打開鏈接

題目大意爲給出一個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;
}




發佈了24 篇原創文章 · 獲贊 1 · 訪問量 4133
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章