您的位置:首页 > 其它

BFS + 状态压缩 POJ 2965 The Pilots Brothers' refrigerator

2013-07-29 21:28 399 查看
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

using namespace std;

char c;

int m;

int sp[999999];

struct Q
{
int sta,ans,r,c,pre;
} q[999999],t,t1;

int top = 0,sum = 999999;

bool vis[65536];

void search(int site,int sta,int ans)
{
int s = 0,e = 0;
q[e].r = q[e].c = q[e].pre = -1;
q[e].sta = sta;
q[e++].ans = ans;

vis[sta] = true;

int i,j;

while(s != e)
{
t1 = q[s++];
if(t1.sta == 65535)
{
sum = t1.ans;
m = s-1;
return;
}
for(i = 1; i <= 4; i++)
for(j = 1; j <= 4; j++)
{
t = t1;
for(site = i*4-3; site <= i*4; site++)
{
t.sta ^= (1<< (site-1));
}
site = j%4;
if(site == 0)
site = 4;
for(; site <= 16; site += 4)
{
t.sta ^= (1<< (site-1));
}

t.sta ^= (1<< i*4+j-5);

if(vis[t.sta] == false)
{
t.ans++;
q[e] = t;
q[e].pre = s-1;

q[e].r = i;
q[e++].c = j;
vis[t.sta] = true;
}
}
}
}

void output_path(int m)//递归输出路径
{
if(q[m].pre == -1)
return;
output_path(q[m].pre);
printf("%d %d\n",q[m].r,q[m].c);
}

int main()
{
int i,j;

char s[10];

sum = 999999;

memset(vis,false,sizeof(vis));

int t;

for(m = 0,t = 1,i = 0; i < 4; i++)
{
scanf("%s",s);
for(j = 0; j < 4; j++)
{
if(s[j] == '-')
m += t;
t *= 2;
}

}

search(1,m,0);

cout<<sum<<endl;

output_path(m);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: