poj 3279 Fliptile

这题做了一下午。。
太随意了,直接把数组开成233*233,导致memcpy一直超时。。居然一下午没发现。。。题目里面 15 分分钟打脸!
以后不能那么随性了!

枚举第一行的所有状态。。然后由下一行使上一行完美。。
代码其实简单的。。
字典序反正我考虑了,,但是不考虑也没关系。。
其实还可以更水。。
一出现答案直接break掉。。居然也能过。。

总之,反正这道题收获蛮多的。。

#include<stdio.h>
#include<string.h>
int map[16][16];
int test[16][16];
int way[16][16];
int finalway[16][16];
int n,m;
void flip(int x,int y)
{
    test[x][y]=!test[x][y];
    if(x>1)
    test[x-1][y]=!test[x-1][y];
    if(x<n)
    test[x+1][y]=!test[x+1][y];
    if(y>1)
    test[x][y-1]=!test[x][y-1];
    if(y<m)
    test[x][y+1]=!test[x][y+1];
}
int main()
{
    scanf("%d%d",&n,&m)!=EOF
        int i,j;
        int bigflag=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                scanf("%d",&map[i][j]);
        int minstep=0x3f3f3f3f;
        for(i=0;i<=(1<<(m+1))-1;i++)
        {
            int i1,j1;
            int flag=1;
            int step=0;
            memcpy(test,map,sizeof(map));
            memset(way,0,sizeof(way));
            for(j1=0;j1<m;j1++)
            {
                if(i&(1<<j1))
                {
                    flip(1,m-j1);
                    way[1][m-j1]=1;
                    step++;
                }
            }
            for(i1=1;i1<n;i1++)
                for(j1=1;j1<=m;j1++)
                {
                    if(test[i1][j1]==1)
                    {
                        flip(i1+1,j1);
                        way[i1+1][j1]=1;
                        step++;
                    }
                }
            for(i1=1;i1<=m;i1++)
            {
                if(test[n][i1]!=0)
                {
                    flag=0;
                    break;
                }
            }
            if(flag==1&&step<minstep)
            {
                minstep=step;
                bigflag=1;
                memcpy(finalway,way,sizeof(way));
            }
        }
        if(bigflag==1)
        {
            for(i=1;i<=n;i++)
             {
                 for(j=1;j<=m-1;j++)
                 printf("%d ",finalway[i][j]);
                 printf("%d\n",finalway[i][j]);
             }
        }
        else
            puts("IMPOSSIBLE");
    return 0;
}

你可能感兴趣的:(枚举,poj)