您的位置:首页 > 其它

hdu 1067 Gap bfs+hash

2014-09-17 11:04 375 查看
题意:

给一个4*7的矩阵,然后把11,,21,31,41移动到最前面,他们的位置都用空格表示。

每次移动,只能是用一个数与空格的位置交换,交换的条件是,这个数必须是空格所在位置之前一个数+1的值

做法:

bfs+hash

hash写的好就没问题了。

我用的hash是

seven[j]表示7的j次方

a.map[i][j]*seven[j]*(i+1);


#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
struct Node{
int map[4][8];
};
int map1[4][8];
Node queue[100001];
set<int>haha;
int dist[100001];
int en;
int seven[8];
void init(){
seven[0] = 1;
for(int i = 1;i < 8; i++)
seven[i] = seven[i-1]*7;
en = 0;
for(int i = 0;i < 4; i++){
for(int j = 0;j < 7; j++)
en += (i*10+j+1)*seven[j]*(i+1);
}
}
int hash(Node &a){
int ans = 0,len=1;
for(int i = 0;i < 4;i++){
for(int j = 0;j < 8 ;j++)
ans +=a.map[i][j]*seven[j]*(i+1);
}
return ans;
}
int work(){
int front=1,tail=0,s;
for(int i = 0;i < 4; i++)
for(int j = 0;j < 8;j++){
queue[0].map[i][j] = map1[i][j];
}
haha.clear();
dist[0] = 0;
s = hash(queue[0]);
if(s == en) return 0;
haha.insert(s);
int u;
int i,j,k,l;
while(tail < front){
for( i = 0;i < 4; i++){
for( j = 0;j < 7 ;j++){
if(queue[tail].map[i][j+1] == 0 && queue[tail].map[i][j] != 0){
for(k = 0;k < 4; k++)
for(l =0;l < 8; l++){
if(queue[tail].map[k][l] == queue[tail].map[i][j]+1) goto aaa;
}
aaa:;
queue[front] = queue[tail];
swap(queue[front].map[i][j+1],queue[front].map[k][l]);
s = hash(queue[front]);
if(haha.find(s) != haha.end()) continue;
if(s == en) return dist[tail]+1;
haha.insert(s);
dist[front] = dist[tail]+1;
front++;
}
}
}
tail++;
}
return -1;
}

int main(){
int t;
init();
scanf("%d",&t);
while(t--){
for(int j = 0;j < 4; j++)
for(int i = 1;i < 8;i++)
scanf("%d",&map1[j][i]);
int u,cnt=0;
for(int i = 0;i < 4; i++){
map1[i][0] = i*10+1;
for(int j = 1;j < 8 ;j++){
map1[i][j]-=10;
if(map1[i][j] % 10 == 1){
map1[i][j] = 0;
}
}
}
printf("%d\n",work());
}
return 0;
}

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