您的位置:首页 > 其它

BZOJ1054 [HAOI2008]移动玩具

2014-10-30 15:35 253 查看
有时候题解要写的简略一点...于是:

裸的bfs妥妥的。。。

注意hash函数的选取及判断重复即可

结果memcpy函数写错了,调了好长好长时间、、、哭T T...

(据说不判重也可以过。。。汗!)

/**************************************************************
Problem: 1054
User: rausen
Language: C++
Result: Accepted
Time:28 ms
Memory:3060 kb
****************************************************************/

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
bool Ans[5][5], vis[70000];
struct data{
bool a[5][5];
int step;
}q[70000];
int begin, end, H;
int l, r;

int hash(bool a[5][5]){
int k = 1, res = 0, i, j;
for (i = 1; i <= 4; ++i)
for (j = 1; j <= 4; ++j)
res += k * a[i][j], k <<= 1;
return res;
}

int main(){
char ch[5];
int i, j, k, X, Y;
for (i = 1; i <= 4; ++i)
for (j = 1, scanf("%s", ch); j <= 4; ++j)
q[0].a[i][j] = ch[j - 1] - '0';
for (i = 1; i <= 4; ++i)
for (j = 1, scanf("%s", ch); j <= 4; ++j)
Ans[i][j] = ch[j - 1] - '0';
begin = hash(q[0].a);
end = hash(Ans);
if (begin == end){
printf("0\n");
return 0;
}
vis[begin] = 1;
for (l = r = 0; l <= r; ++l)
for (i = 1; i <= 4; ++i)
for (j = 1; j <= 4; ++j)
if (q[l].a[i][j]) for (k = 0; k < 4; ++k){
X = i + dx[k], Y = j + dy[k];
if (X < 1 || Y < 1 || X > 4 || Y > 4 || q[l].a[X][Y])
continue;
swap(q[l].a[i][j], q[l].a[X][Y]);
H = hash(q[l].a);
if (!vis[H]){
if (H == end){
printf("%d\n", q[l].step + 1);
return 0;
}
vis[H] = 1;
q[++r].step = q[l].step + 1;
memcpy(q[r].a, q[l].a, sizeof(q[r].a));
}
swap(q[l].a[i][j], q[l].a[X][Y]);
}
return 0;
}


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