比赛 |
20120810 |
评测结果 |
AAAAAAAAAA |
题目名称 |
移动骷髅 |
最终得分 |
100 |
用户昵称 |
Makazeu |
运行时间 |
0.022 s |
代码语言 |
C++ |
内存使用 |
0.31 MiB |
提交时间 |
2012-08-10 10:41:56 |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int T,ans;
typedef vector<char> klmap;
typedef vector<int> Hash;
map<Hash,int> hash;
int binary[26];
class Queue
{
public:
int f;klmap sta;
inline void read()
{
sta.clear();int c;f=1;sta.push_back(0);
for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++)
{
c=0;while(c<'0' || c>'9')
scanf("%c",&c);sta.push_back(c);
}
}
}
vector<int> gethash()
{
vector<int> tmp;
tmp.push_back(0);
tmp.push_back(0);
for(int i=1;i<=25;i++)
{
if(sta[i]=='2') tmp[1]=i;
else tmp[0]=tmp[0]+(sta[i]-'0')*binary[i];
}
return tmp;
}
}Haji;
Queue tmp,nxt;
klmap ts,ns;
queue<Queue> q;
inline int Min(int a,int b) {return a<b?a:b;}
inline void debug(klmap k)
{
for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++)
printf("%c",k[(i-1)*5+j]);
printf("\n");
}
printf("\n");
}
inline void bfs()
{
q.push(Haji);int tf,nf,nh;
hash[Haji.gethash()]=1;
int now,step[5]={0,1,-1,5,-5};
while(q.size())
{
tmp=q.front(); q.pop(); ts=tmp.sta; tf=tmp.f;
if(tf+1>=ans) continue;
for(int i=1;i<=25;i++)
{
if(ts[i]=='0') continue;
for(int k=1;k<=4;k++)
{
if(tf+1>=ans) continue;
now=i; while(1)
{
now+=step[k];
if(now<1 || now>25 || (now%5==0 && step[k]==-1) || (now%5==1 && step[k]==1))
goto end;
if(ts[now]>'0') break;
}
now-=step[k];
if(now==i) continue;
ns=ts; ns[now]=ns[i]; ns[i]='0'; nf=tf+1;
if(ns[13]=='2') {/*debug(ts);debug(ns);*/ ans=Min(ans,nf);continue;}
nxt.sta=ns; nxt.f=nf; nh=hash[nxt.gethash()];
if(nh!=0 && nh<=nf) continue;
hash[nxt.gethash()]=nf; q.push(nxt);
end:;
}
}
}
}
int main()
{
freopen("klgame.in","r",stdin);
freopen("klgame.out","w",stdout);
binary[1]=1;for(int i=2;i<=25;i++)
binary[i]=binary[i-1]*2;
scanf("%d\n",&T);
for(int i=1;i<=T;i++)
{
Haji.read();
hash.clear();
ans=100000000;
bfs();
printf("level %d:\n%d\n",i,ans-1);
}
return 0;
}