标签:
传送门:http://poj.org/problem?id=2965
思路:二进制枚举,递归输出路径。G++ 900+Ms勉强过,C++超时。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const int N=100007;
int vis[N];
int step[N][4];
int change(int state,int i,int j)
{
for(int k=0;k<4;k++)
{
state=state^1<<(4*k+j);
state=state^1<<(4*i+k);
}
state=state^1<<(i*4+j);
return state;
}
void output(int state)
{
if(step[state][0]==0)
return;
else{
output(step[state][1]);
printf("%d %d\n",step[state][2],step[state][3]);
}
}
void bfs(int state)
{
queue<int> que;
que.push(state);
while(!que.empty())
{
int cur=que.front();
que.pop();
if(cur==65535)
{
printf("%d\n",step[65535][0]);
output(65535);
break;
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
int tmp=change(cur,i,j);
if(!vis[tmp])
{
vis[tmp]=1;
step[tmp][0]=step[cur][0]+1;
step[tmp][1]=cur;
step[tmp][2]=i+1;
step[tmp][3]=j+1;
que.push(tmp);
}
}
}
}
}
int main()
{
//mem(vis,0);
//mem(step,0);
int state=0;
for(int i=0;i<16;i++)
{
char c;
cin>>c;
if(c=='-')
{
state=state|1<<i;
}
}
vis[state]=1;
bfs(state);
return 0;
}
poj 2965 The Pilots Brothers' refrigerator[ 枚举 ]
标签:
原文地址:http://blog.csdn.net/code_or_code/article/details/43673563