POJ 2811 熄灯问题

这道题主要考察的是枚举算法

#include<iostream>
#include<string.h>
usingnamespace std;
int N;
int map[7][8];
int orignal[7][8];
int pre[7][8];
int sequence[7];
voidpress(int i,int j)//按下坐标为 (i,j)的按钮
{
    map[i][j]=(map[i][j]+1)%2;
    map[i-1][j]=(map[i-1][j]+1)%2;
    map[i+1][j]=(map[i+1][j]+1)%2;
    map[i][j-1]=(map[i][j-1]+1)%2;
    map[i][j+1]=(map[i][j+1]+1)%2;
}
int  cmp()
{
    for(int i=1;i<=5;i++)
    {
        for(int j=1;j<=6;j++)
        {
            if(map[i][j]==1)
            {return0;
            }
        }
    }
    return1;
}
voidbinary(int n)
{
    int i=0;
    while(n!=0)
    {
        sequence[++i]=n%2;
        n>>=1;
    }
}
voidsolve()
{
    int i,j,k;
    for(i=0;i<64;i++)
    {
        for(j=1;j<=5;j++)
        {
            for(k=1;k<=6;k++)
            {
                map[j][k]=orignal[j][k];
            }
        }
        memset(sequence,0,sizeof(sequence));
        memset(pre,0,sizeof(pre));
        binary(i);
        for(j=1;j<=6;j++)
        {
            if(sequence[j]==1)
            {
                press(1,j);
                pre[1][j]=1;
            }
        }
        for(j=2;j<=5;j++)
        {
            for(k=1;k<=6;k++)
            {
                if(map[j-1][k]==1)
                {press(j,k);
                    pre[j][k]=1;
                }
            }
        }
        if(cmp()==1)
        {
            break;
        }
    }
    for(i=1;i<=5;i++)
    {
        for(j=1;j<=6;j++)
        {
            if(j==6)
            {
                cout<<pre[i][j]<<endl;
            }
            else
            {
                cout<<pre[i][j]<<" ";
            }
        }
    }
}
intmain()
{
    cin>>N;
    int cases=0;
    while(N--)
    {
        cases++;
        memset(map,0,sizeof(map));//0表示是熄灭状态,1表示是亮着状态
        int i,j;
        for(i=1;i<=5;i++)
        {
            for(j=1;j<=6;j++)
            {
                cin>>map[i][j];
                orignal[i][j]=map[i][j];
            }
        }
        cout<<"PUZZLE #"<<cases<<endl;
        solve();
    }
    return0;
}
  


posted on 2011-05-22 22:36  lonelycatcher  阅读(714)  评论(0编辑  收藏  举报

导航