八数码问题(bfs,hash判重)
2017-11-01 17:02
253 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int mod=1000003;
int xx[]={1,-1,0,0};
int yy[]={0,0,1,-1};
struct node{
ll x,y;
}q[maxn];
char s[15];
int a[maxn],ans=123804765,l,r;
vector<int> g[mod];
int main(){
scanf("%s",s);
long long num=0;
int len=strlen(s);
for(int i=0;i<len;i++){
num=num*10+s[i]-'0';
}
//cout<<num<<endl;
l=r=0;
node now; now.x=num; now.y=0; q[++r]=now;
int b[10];
//cout<<1<<endl;
for(int i=8;i>=0;i--){
int nowx10=now.x/pow(10,i);
b[9-i]=(nowx10)%10;
}
/*for(int i=1;i<=9;i++) cout<<b[i]<<' ';
cout<<endl;*/
/*int curx1,cury1,curz1;
for(int i=1;i<=9;i++) if(b[i]==0){
curx1=(i-1)/3+1;
if(i%3==0){
cury1=3;
}
else cury1=i%3;
curz1=i;
}
cout<<curx1<<' '<<cury1<<' '<<curz1<<endl;*/
while(l<r){
now=q[++l];
int nowx=now.x,xx2,xx1=now.x;
//cout<<now.x<<' '<<now.y<<endl;
if(nowx==ans){
cout<<now.y<<endl;
break;
}
//cout<<2<<endl;
for(int i=8;i>=0;i--){
int nowx1=nowx/pow(10,i);
b[9-i]=(nowx1)%10;
}
//cout<<1<<endl;
int curx,cury,curz;
for(int i=1;i<=9;i++) if(b[i]==0){
curx=(i-1)/3+1;
if(i%3==0){
cury=3;
}
else cury=i%3;
curz=i;
}
for(int i=0;i<4;i++){
int fx=curx+xx[i],fy=cury+yy[i];
if(fx<1||fx>3||fy<1||fy>3) continue;
in
9dd5
t num=(fx-1)*(3)+fy;
for(int j=1;j<=9;j++)
a[j]=b[j];
int tmp=a[num]; a[num]=0; a[curz]=tmp;
int now1=0,now2;
for(int j=1;j<=9;j++){
now1=now1*10+a[j];
}
now2=now1;
now1%=mod;
int f=true;
for(int j=0;j<g[now1].size();j++){
if(g[now1][j]==now2){
f=false; break;
}
}
if(f){
node now3; now3.x=now2; now3.y=now.y+1;
q[++r]=now3; g[now1].push_back(now2);
}
a[num]=tmp; a[curz]=0;
}
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int mod=1000003;
int xx[]={1,-1,0,0};
int yy[]={0,0,1,-1};
struct node{
ll x,y;
}q[maxn];
char s[15];
int a[maxn],ans=123804765,l,r;
vector<int> g[mod];
int main(){
scanf("%s",s);
long long num=0;
int len=strlen(s);
for(int i=0;i<len;i++){
num=num*10+s[i]-'0';
}
//cout<<num<<endl;
l=r=0;
node now; now.x=num; now.y=0; q[++r]=now;
int b[10];
//cout<<1<<endl;
for(int i=8;i>=0;i--){
int nowx10=now.x/pow(10,i);
b[9-i]=(nowx10)%10;
}
/*for(int i=1;i<=9;i++) cout<<b[i]<<' ';
cout<<endl;*/
/*int curx1,cury1,curz1;
for(int i=1;i<=9;i++) if(b[i]==0){
curx1=(i-1)/3+1;
if(i%3==0){
cury1=3;
}
else cury1=i%3;
curz1=i;
}
cout<<curx1<<' '<<cury1<<' '<<curz1<<endl;*/
while(l<r){
now=q[++l];
int nowx=now.x,xx2,xx1=now.x;
//cout<<now.x<<' '<<now.y<<endl;
if(nowx==ans){
cout<<now.y<<endl;
break;
}
//cout<<2<<endl;
for(int i=8;i>=0;i--){
int nowx1=nowx/pow(10,i);
b[9-i]=(nowx1)%10;
}
//cout<<1<<endl;
int curx,cury,curz;
for(int i=1;i<=9;i++) if(b[i]==0){
curx=(i-1)/3+1;
if(i%3==0){
cury=3;
}
else cury=i%3;
curz=i;
}
for(int i=0;i<4;i++){
int fx=curx+xx[i],fy=cury+yy[i];
if(fx<1||fx>3||fy<1||fy>3) continue;
in
9dd5
t num=(fx-1)*(3)+fy;
for(int j=1;j<=9;j++)
a[j]=b[j];
int tmp=a[num]; a[num]=0; a[curz]=tmp;
int now1=0,now2;
for(int j=1;j<=9;j++){
now1=now1*10+a[j];
}
now2=now1;
now1%=mod;
int f=true;
for(int j=0;j<g[now1].size();j++){
if(g[now1][j]==now2){
f=false; break;
}
}
if(f){
node now3; now3.x=now2; now3.y=now.y+1;
q[++r]=now3; g[now1].push_back(now2);
}
a[num]=tmp; a[curz]=0;
}
}
return 0;
}
相关文章推荐
- 【BFS】由八数码问题的BFS解法引出的三种BFS经典状态判重方法
- 八数码问题 bfs+map
- BFS 八数码问题 typedef int State[9]; (BFS A*算法与优先队列)
- 八数码问题 - BFS
- HDU(3567):八数码问题(升级版)——双BFS
- 历届试题 九宫重排 (bfs 八数码问题)
- 八数码问题,bfs,hash,康托
- POJ 1077 Eight 八数码问题 BFS
- HDU-1043 Eight八数码 搜索问题(bfs+hash 打表 IDA* 等)
- 基于八数码问题的hash判重
- BFS:八数码问题
- hdu 1043 八数码 经典搜索问题 BFS+MAP
- 八数码问题详解(用bfs实现)
- 八数码问题(A*&&双向BFS)
- UVALive 6665 Dragon&#226;s Cruller --BFS,类八数码问题
- 双向BFS解八数码问题: POJ 1077
- POJ1077、HDU1043 Eight 八数码问题:双向BFS、A*
- bfs+hash poj 1077/hdu 1043 八数码问题
- 【A*/Meet in the middle/BFS模板】8数码问题
- 每天刷个算法题20160526:BFS解决八数码问题(九宫格问题)