POJ 2965 The Pilots Brothers' refrigerator 状态压缩+枚举 , bfs
http://poj.org/problem?id=2965
跟 poj1753 一个类型的
题意:还是四行四列的格子 里面有+和- ,变换一个符号的同时,它所在的行和列也要变,求最少的步数
问题是记录路径 无语
开始用的queueu队列,记录路径 TLE 后来改成数组 记录前一个点 运行时间还是长。。。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#define MAX 660000
using namespace std;
char a[18];
bool vis[1<<17]={0};
int add[16]={ 0x111f, 0x222f, 0x444f, 0x888f,
0x11f1, 0x22f2, 0x44f4, 0x88f8,
0x1f11, 0x2f22, 0x4f44, 0x8f88,
0xf111, 0xf222, 0xf444, 0xf888
};
struct Node
{
int num,grid,pre,step;
}qu[MAX];
void bfs(int x)
{
if(x==0)
{
cout<<'0'<<endl;
return ;
}
int SUM=0,beg=0,end=0;
qu[0].step=0;
qu[0].num=x;
vis[x]=1;
while(beg<=end)
{
Node t=qu[beg];
beg++;
if(t.num==0)
{
cout<<t.step<<endl;
while(1)
{
int a=t.grid;
cout<<a/4+1<<" "<<a%4+1<<endl;
t=qu[t.pre];
if(t.step==0)
break;
}
}
for(int i=0;i<16;i++)
{
int inf=t.num^add[i];
if(!vis[inf])
{
vis[inf]=1;
end++;
qu[end].num=inf;
qu[end].step=t.step+1;
qu[end].pre=beg-1;
qu[end].grid=i;
}
}
}
}
int main()
{
int i,Sum=0;
for(i=0;i<16;i++)
{
cin>>a[i];
if(a[i]=='+')
Sum+=1<<i;
}
bfs(Sum);
return 0;
}

浙公网安备 33010602011771号