记录编号 |
42719 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
空格游戏 |
最终得分 |
100 |
用户昵称 |
luishenSTL没优化就成渣 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.840 s |
提交时间 |
2012-09-28 11:05:29 |
内存使用 |
3.13 MiB |
显示代码纯文本
#include<map>
#include<queue>
#include<string>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef struct point{
int x,y;
}point;
typedef struct node{
string s;
int step;
point p[4];
point pos[50];
}node;
node start;
string target;
void
output(string str){
for(int i=0; i<4; i++) {
for(int j=0; j<=7; j++) printf("%3d",str[i*8+j]);
printf("\n");
}
}
void
solve(){
map<string,bool> m;
map<string,bool>::iterator it;
m[ start.s ] = true;
start.step=0;
node now,next;
queue <node> q; q.push(start);
int cnt=1;
while(!q.empty()) {
now = q.front(); q.pop();
if(now.s==target) {
printf("%d\n",now.step); return ;
}
for(int i=0; i<4; i++) {
next = now; ++next.step;
point &gap = next.p[i];
int num = next.s[ gap.x * 8 + gap.y -1 ]; // gap 左边的数字
if(num%10==7 || num==0) continue;
int suc = num+1;
point &sucp = next.pos[ suc ];
//将gap与后驱交换位置
swap(next.s[ gap.x * 8 + gap.y ],next.s[ sucp.x*8 + sucp.y ]);
// 将gap的坐标与 后驱的坐标交换
swap(next.p[i],sucp);
it = m.find(next.s);
if(it==m.end()) {
m[ next.s ] = true;
q.push(next);
}
}
}
puts("-1");
}
int main(){
freopen("gap.in","r",stdin);
freopen("gap.out","w",stdout);
target="";
for(int i=1; i<=4; i++) {
for(int j=1; j<=7; j++) target+= char(i*10+j); target+=char(0);
}
int t=1; //scanf("%d",&t);
while(t--) {
int a[5][8]; memset(a,0,sizeof(a));
start.s="";
for(int i=0; i<4; i++) for(int j=1; j<=7; j++) {
scanf("%d",&a[i][j]);
for(int k=1; k<=4; k++) {
if(a[i][j]==k*10+1) swap(a[k-1][0],a[i][j]),start.p[k-1].x=i,start.p[k-1].y=j;
}
}
for(int i=0; i<4; i++) for(int j=0; j<8; j++) {
point tmp; tmp.x=i; tmp.y=j;
if(a[i][j]) start.pos[ a[i][j] ]=tmp;
start.s+=char(a[i][j]);
}
solve();
} // end while
return 0;
}