poj1753 Flip Game

来源:互联网 发布:自己开淘宝店怎么代理 编辑:程序博客网 时间:2024/05/17 17:44

#include<iostream>
using namespace std;
//#define REVERSE(DATA,BIT) DATA^(1<<BIT)
bool v[65535];
int head,tail;
struct point{
    int dis;
    unsigned short state;
};
point Q[65535];
int bfs();
bool vis(point& t);
unsigned short move(unsigned short state, int i);
int main()
{   
    int l=bfs();
    if(l<0)
        cout<<"Impossible"<<endl;
    else
        cout<<l<<endl;
    return 0;
}
bool vis(point& t)
{   
    if(v[t.state])
        return true;
    v[t.state]=1;
    return false;
}
int bfs()
{   
    point t,now,ext;
    int i=0,j=0,c;
    char str[5][5]; //注意,定义长度时要大于4*4,一定要包含结束符,不然提交之后是WA
    t.state=0;
    memset(v,0,sizeof(v));
    for(i=1;i<=4;i++)
    {
        cin>>str[i-1];
    }
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            if(str[i][j]=='b')
                c=1;
            else
                c=0;
            t.state|=c<<(i*4+j);
        }
        t.dis=0;
        head=tail=0;
        Q[tail++]=t;
    //    vis(t);
        v[t.state]=1;
        while(head<tail)
        {   
            now=Q[head++];
            if(now.state==0 || now.state==65535)       
                return now.dis;
            int s=now.state; 
            unsigned short temp=0;   
            for(i=0;i<16;++i)
            {
                temp=0;
                temp |= (1<<i);
                if((i+1)%4!=0)
                    temp |= (1<<(i+1)); 
                if(i%4 != 0)
                    temp |= (1<<(i-1));
                if(i+4 < 16)
                    temp |= (1<<(i+4));
                if(i-4 >= 0)
                    temp |= (1<<(i-4));
                ext.state=s^temp;
                ext.dis=now.dis+1;
                if(!vis(ext))
                {
                    Q[tail++]=ext;
                }
            }
        }
    return -1;
}

注:本题的技巧在于如何表示所有可能出现得plates状态,一共16个盘子,可以使用16位来表示,即两个字节。本题涉及到对某一位求反,可用函数REVERSE(DATA,BIT) DATA^(1<<BIT)。

原创粉丝点击