POJ2965

#include <stdio.h>
char map[4][4];
int map1[4][4];
int map2[4][4];
int num[16];
int min=1000,n;
int shu[20];
int shu1[20];
int len;
void bian(int x , int y)
{
    for(int i=0;i<4;i++)
    {
        if(i!=y)
        {
            if(map2[x][i]==0)
                map2[x][i]=1;
            else
                map2[x][i]=0;
        }
            if(map2[i][y]==0)
                map2[i][y]=1;
            else
                map2[i][y]=0;
    }
}
int safe()
{
    int r=1;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(map2[i][j]==1)
            {
                r=0;
                break;
            }
        }
        if(r==0)
            break;
    }
    return r;
}
void  dfs(int step)
{
    if(step==16)
    {
        n=0;
        len=0;
        int k=0;
        for(int i=0;i<4;i++)
            for(int j=0;j<4;j++)
                map2[i][j]=map1[i][j];
        for(int i=0;i<16;i++)
        {
            if(num[i]==1)
            {
                bian(i/4,i%4);
                shu[n]=i/4;
                shu1[n]=i%4;
                n++;
                if(n>min)
                    return;
            }
        }
        if(safe())
        {
            if(n<min)
            {
                min=n;
                printf("%d\n",min);
                for(int i=0;i<min;i++)
                printf("%d %d\n",shu[i]+1,shu1[i]+1);
            }
        }
        return ;
    }
    for(int i=0;i<2;i++)
    {
        num[step]=i;
        dfs(step+1);
    }
}
int main()
{
    freopen("in.txt","r",stdin);
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            scanf("%c",&map[i][j]);
            if(map[i][j]=='+')
                map1[i][j]=1;
            if(map[i][j]=='-')
                map1[i][j]=0;            
        }
        getchar();
    }
    dfs(0);
    return 0;
}

 

posted on 2017-01-05 14:18  霸王程  阅读(67)  评论(0编辑  收藏  举报