(中等) HDU 1043 Eight,经典搜索问题。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 x
where
the only legal operation is to exchange 'x' with one of the tiles with
which it shares an edge. As an example, the following sequence of moves
solves a slightly scrambled puzzle:
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8
9 x 10 12 9 10 x 12 9 10 11 12 9 10 11 12
13 14 11 15 13 14 11 15 13 14 x 15 13 14 15 x
r-> d-> r->
The
letters in the previous row indicate which neighbor of the 'x' tile is
swapped with the 'x' tile at each step; legal values are 'r','l','u' and
'd', for right, left, up, and down, respectively.
Not all
puzzles can be solved; in 1870, a man named Sam Loyd was famous for
distributing an unsolvable version of the puzzle, and
frustrating
many people. In fact, all you have to do to make a regular puzzle into
an unsolvable one is to swap two tiles (not counting the missing 'x'
tile, of course).
In this problem, you will write a program for solving the less well-known 8-puzzle, composed of tiles on a three by three
arrangement.
这前那篇文章也介绍了一些了,那位大神的文章也写的很好了,我就是来水一下。
首先就是我写的康托展开,用来表示每一个状态,其实对于一个状态 2 3 4 1 5 x 7 6 8来说,把x当作0,就是0到8的一个全排了,那么一共就9!种,这样就是第一个*8!,第二个*7!。。。这样下去。。。不过每一个乘的数应该是这个数本身的值减去前面比他小的个数,也就是他在剩下的数里面是第几个。
由一个值转化为一个排列也是如此,每一次找第k个还没有用到的数,就是那个数了。因为这里就只有9个数,直接n^2过一遍就好了。。。(对于很多数,可以用数状数组来做,转化为排列的话就是二分加数状数组。)
然后是减枝,减去无解的情况。对于每一次移动,数的逆序对的奇偶性是不会改变的(这里x不算数),然后的话先求逆序数,如果为奇就直接pass掉。
首先是第一次写,
BFS+康托+剪枝,TLE了。
#include<iostream>
#include<cstring> using namespace std; const int maxn=;
const int Enum=;
const int jie[]={,,,,,,,,}; int que[];
int fa[maxn];
int las,fir;
int rem[maxn];
char ans1[maxn];
int cou; int hebing(int (*m)[])
{
bool vis[]={};
int cou;
int ans=; for(int i=;i<;++i)
{
cou=;
for(int j=;j<m[i/][i%];++j)
if(vis[j])
++cou; vis[m[i/][i%]]=; ans+=(m[i/][i%]-cou)*jie[-i];
} return ans;
} void zhankai(int (*m)[],int x)
{
bool vis[]={};
int cou;
int k; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cou=x/jie[-*i-j]+; // !!!
x%=jie[-*i-j]; for(k=;k<&&cou;++k)
if(vis[k]==)
--cou; vis[k-]=; // !!!
m[i][j]=k-; // !!!
}
} void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
} bool judge(int x,int y)
{
if(x<||y<||x>||y>)
return ; return ;
} void showans()
{
int temp=Enum;
char c;
cou=; while(fa[temp]!=-)
{
if(rem[temp]==)
c='d';
else if(rem[temp]==)
c='l';
else if(rem[temp]==)
c='u';
else
c='r'; ans1[cou++]=c; temp=fa[temp];
} for(int i=cou-;i>=;--i)
cout<<ans1[i]; cout<<endl;
} void solve(int (*m)[])
{
int ni=; for(int i=;i<;++i)
for(int j=;j<i;++j)
if(m[i/][i%]&&m[j/][j%])
if(m[i/][i%]<m[j/][j%])
++ni; if(ni%)
{
cout<<"unsolvable\n";
return;
} las=fir=;
memset(rem,,sizeof(rem)); bool ok=;
int temp,t1[][],temp1;
int x0,y0; temp=hebing(m); rem[temp]=-;
que[las++]=temp;
fa[temp]=-; while(las-fir)
{
temp=que[fir++]; if(temp==Enum)
{
ok=;
break;
} zhankai(t1,temp); for(int i=;i<;++i)
for(int j=;j<;++j)
if(t1[i][j]==)
x0=i,y0=j; if(judge(x0-,y0))
{
swap(t1[x0][y0],t1[x0-][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
rem[temp1]=;
fa[temp1]=temp;
que[las++]=temp1;
} swap(t1[x0][y0],t1[x0-][y0]);
}
if(judge(x0+,y0))
{
swap(t1[x0+][y0],t1[x0][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
rem[temp1]=;
fa[temp1]=temp;
que[las++]=temp1;
} swap(t1[x0][y0],t1[x0+][y0]);
}
if(judge(x0,y0-))
{
swap(t1[x0][y0-],t1[x0][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
rem[temp1]=;
fa[temp1]=temp;
que[las++]=temp1;
} swap(t1[x0][y0],t1[x0][y0-]);
}
if(judge(x0,y0+))
{
swap(t1[x0][y0+],t1[x0][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
rem[temp1]=;
fa[temp1]=temp;
que[las++]=temp1;
} swap(t1[x0][y0],t1[x0][y0+]);
}
} if(ok)
showans();
else
cout<<"unsolvable"<<endl;
} int main()
{
ios::sync_with_stdio(false); int m[][];
char c; while(cin>>c)
{
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-''; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cin>>c;
m[i][j]=c=='x'?:c-'';
} solve(m);
} return ;
}
然后就是
双向BFS+康托+剪枝,就过了。
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; const int maxn=;
const int Enum=;
const int jie[]={,,,,,,,,};
const int step[][]={{,},{,-},{-,},{,}}; int Snum,Mnum;
int fa[maxn],son[maxn];
int rem[maxn],Mrem;
int que1[maxn],que2[maxn];
int las1,las2,fir1,fir2;
char ans[maxn]; int hebing(int (*m)[])
{
bool vis[]={};
int cou;
int ans=; for(int i=;i<;++i)
{
cou=;
for(int j=;j<m[i/][i%];++j)
if(vis[j])
++cou; vis[m[i/][i%]]=; ans+=(m[i/][i%]-cou)*jie[-i];
} return ans;
} void zhankai(int (*m)[],int x)
{
bool vis[]={};
int cou;
int k; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cou=x/jie[-*i-j]+; // !!!
x%=jie[-*i-j]; for(k=;k<&&cou;++k)
if(vis[k]==)
--cou; vis[k-]=; // !!!
m[i][j]=k-; // !!!
}
} void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
} bool judge(int x,int y)
{
if(x<||y<||x>||y>)
return ; return ;
} void showans()
{
int cou=;
char c;
int tnum=Mnum; while(tnum!=Snum)
{
if(rem[tnum]==)
c='d';
else if(rem[tnum]==)
c='l';
else if(rem[tnum]==)
c='u';
else
c='r'; ans[cou++]=c; tnum=fa[tnum];
} for(int i=cou-;i>=;--i)
cout<<ans[i]; rem[Mnum]=Mrem;
tnum=Mnum; while(tnum!=Enum)
{
rem[tnum]=-rem[tnum];
if(rem[tnum]==)
c='u';
else if(rem[tnum]==)
c='r';
else if(rem[tnum]==)
c='d';
else
c='l'; cout<<c; tnum=son[tnum];
} cout<<endl;
} bool bfs()
{
fir1=fir2=las1=las2=; int temp,t1[][],t2[][];
int tnum1,tnum2;
int x01,y01,x02,y02; que1[las1++]=Snum;
que2[las2++]=Enum; rem[Snum]=;
rem[Enum]=-; son[Enum]=Enum;
fa[Snum]=Snum; while(las1-fir1&&las2-fir2)
{
tnum1=que1[fir1++];
tnum2=que2[fir2++]; zhankai(t1,tnum1);
zhankai(t2,tnum2); for(int i=;i<;++i)
for(int j=;j<;++j)
{
if(t1[i][j]==)
x01=i,y01=j;
if(t2[i][j]==)
x02=i,y02=j;
} for(int i=;i<;++i)
{
if(judge(x01+step[i][],y01+step[i][])==)
continue; swap(t1[x01][y01],t1[x01+step[i][]][y01+step[i][]]);
temp=hebing(t1); if(rem[temp]==)
{
rem[temp]=i+;
fa[temp]=tnum1;
que1[las1++]=temp;
}
else if(rem[temp]<)
{
fa[temp]=tnum1;
Mrem=rem[temp];
rem[temp]=i+;
Mnum=temp; return ;
} swap(t1[x01][y01],t1[x01+step[i][]][y01+step[i][]]);
} for(int i=;i<;++i)
{
if(judge(x02+step[i][],y02+step[i][])==)
continue; swap(t2[x02][y02],t2[x02+step[i][]][y02+step[i][]]);
temp=hebing(t2); if(rem[temp]==)
{
rem[temp]=-(i+);
son[temp]=tnum2;
que2[las2++]=temp;
}
else if(rem[temp]>)
{
son[temp]=tnum2;
Mrem=-(i+);
Mnum=temp; return ;
} swap(t2[x02][y02],t2[x02+step[i][]][y02+step[i][]]);
}
} return ;
} void solve(int (*m)[])
{
int ni=; for(int i=;i<;++i)
for(int j=;j<i;++j)
if(m[i/][i%]&&m[j/][j%])
if(m[i/][i%]<m[j/][j%])
++ni; if(ni%)
{
cout<<"unsolvable\n";
return;
} memset(rem,,sizeof(rem)); Snum=hebing(m); if(Snum==Enum)
{
cout<<endl;
return;
} if(bfs())
showans();
else
cout<<"unsolvable\n";
} int main()
{
ios::sync_with_stdio(false); int m[][];
char c; while(cin>>c)
{
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-''; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cin>>c;
m[i][j]=c=='x'?:c-'';
} solve(m);
} return ;
}
A*(曼哈顿距离)+康托+剪枝。
#include<iostream>
#include<cstring>
#include<queue>
#include<utility>
#include<cmath>
#include<cstdio> using namespace std; const int maxn=;
const int Enum=;
const int jie[]={,,,,,,,,}; struct state
{
int F,G,num; state() {}
state(int a,int b,int c):F(a),G(b),num(c) {} friend bool operator < (state x,state y)
{
return x.F>y.F;
}
}; int fa[maxn];
int rem[maxn];
char ans1[maxn];
int cou; int hebing(int (*m)[])
{
bool vis[]={};
int cou;
int ans=; for(int i=;i<;++i)
{
cou=;
for(int j=;j<m[i/][i%];++j)
if(vis[j])
++cou; vis[m[i/][i%]]=; ans+=(m[i/][i%]-cou)*jie[-i];
} return ans;
} void zhankai(int (*m)[],int x)
{
bool vis[]={};
int cou;
int k; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cou=x/jie[-*i-j]+; // !!!
x%=jie[-*i-j]; for(k=;k<&&cou;++k)
if(vis[k]==)
--cou; vis[k-]=; // !!!
m[i][j]=k-; // !!!
}
} void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
} bool judge(int x,int y)
{
if(x<||y<||x>||y>)
return ; return ;
} void showans()
{
int temp=Enum;
char c;
cou=; while(fa[temp]!=-)
{
if(rem[temp]==)
c='d';
else if(rem[temp]==)
c='l';
else if(rem[temp]==)
c='u';
else
c='r'; ans1[cou++]=c; temp=fa[temp];
} for(int i=cou-;i>=;--i)
cout<<ans1[i]; cout<<endl;
} int getH(int (*m)[])
{
int H=; for(int i=;i<;++i)
for(int j=;j<;++j)
if(m[i][j])
H+=abs(i-(m[i][j]-)/)+abs(j-(m[i][j]-)%);
else
H+=abs(i-)+abs(j-); return H;
} void solve(int (*m)[])
{
int ni=; for(int i=;i<;++i)
for(int j=;j<i;++j)
if(m[i/][i%]&&m[j/][j%])
if(m[i/][i%]<m[j/][j%])
++ni; if(ni%)
{
cout<<"unsolvable\n";
return;
} priority_queue <state> que; memset(rem,,sizeof(rem)); bool ok=;
int temp,t1[][],temp1;
int x0,y0;
int H=,G;
state tsta; temp=hebing(m); que.push(state(H,,temp));
rem[temp]=-;
fa[temp]=-; while(!que.empty())
{
H=; tsta=que.top();
que.pop(); G=tsta.G;
temp=tsta.num; if(temp==Enum)
{
ok=;
break;
} zhankai(t1,temp); for(int i=;i<;++i)
for(int j=;j<;++j)
if(t1[i][j]==)
x0=i,y0=j; if(judge(x0-,y0))
{
swap(t1[x0][y0],t1[x0-][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
H=getH(t1);
rem[temp1]=;
fa[temp1]=temp;
que.push(state(G++H,G+,temp1));
} swap(t1[x0][y0],t1[x0-][y0]);
}
if(judge(x0+,y0))
{
swap(t1[x0+][y0],t1[x0][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
H=getH(t1);
rem[temp1]=;
fa[temp1]=temp;
que.push(state(G+H+,G+,temp1));
} swap(t1[x0][y0],t1[x0+][y0]);
}
if(judge(x0,y0-))
{
swap(t1[x0][y0-],t1[x0][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
H=getH(t1);
rem[temp1]=;
fa[temp1]=temp;
que.push(state(G+H+,G+,temp1));
} swap(t1[x0][y0],t1[x0][y0-]);
}
if(judge(x0,y0+))
{
swap(t1[x0][y0+],t1[x0][y0]);
temp1=hebing(t1); if(rem[temp1]==)
{
H=getH(t1);
rem[temp1]=;
fa[temp1]=temp;
que.push(state(G+H+,G+,temp1));
} swap(t1[x0][y0],t1[x0][y0+]);
}
} if(ok)
showans();
else
cout<<"unsolvable"<<endl;
} int main()
{
ios::sync_with_stdio(false); int m[][];
char c; while(cin>>c)
{
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-''; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cin>>c;
m[i][j]=c=='x'?:c-'';
} solve(m);
} return ;
}
双向A*(曼哈顿距离)+康托+剪枝。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath> using namespace std; const int maxn=;
const int Enum=;
const int jie[]={,,,,,,,,};
const int step[][]={{,},{,-},{-,},{,}}; struct state
{
int F,G,num; state() {}
state(int a,int b,int c):F(a),G(b),num(c) {} friend bool operator < (state x,state y)
{
return x.F>y.F;
}
}; int Snum,Mnum;
int fa[maxn],son[maxn];
int rem[maxn],Mrem;
char ans[maxn]; int hebing(int (*m)[])
{
bool vis[]={};
int cou;
int ans=; for(int i=;i<;++i)
{
cou=;
for(int j=;j<m[i/][i%];++j)
if(vis[j])
++cou; vis[m[i/][i%]]=; ans+=(m[i/][i%]-cou)*jie[-i];
} return ans;
} void zhankai(int (*m)[],int x)
{
bool vis[]={};
int cou;
int k; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cou=x/jie[-*i-j]+; // !!!
x%=jie[-*i-j]; for(k=;k<&&cou;++k)
if(vis[k]==)
--cou; vis[k-]=; // !!!
m[i][j]=k-; // !!!
}
} void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
} bool judge(int x,int y)
{
if(x<||y<||x>||y>)
return ; return ;
} void showans()
{
int cou=;
char c;
int tnum=Mnum; while(tnum!=Snum)
{
if(rem[tnum]==)
c='d';
else if(rem[tnum]==)
c='l';
else if(rem[tnum]==)
c='u';
else
c='r'; ans[cou++]=c; tnum=fa[tnum];
} for(int i=cou-;i>=;--i)
cout<<ans[i]; rem[Mnum]=Mrem;
tnum=Mnum; while(tnum!=Enum)
{
rem[tnum]=-rem[tnum];
if(rem[tnum]==)
c='u';
else if(rem[tnum]==)
c='r';
else if(rem[tnum]==)
c='d';
else
c='l'; cout<<c; tnum=son[tnum];
} cout<<endl;
} int getH(int (*m)[])
{
int H=; for(int i=;i<;++i)
for(int j=;j<;++j)
if(m[i][j])
H+=abs(i-(m[i][j]-)/)+abs(j-(m[i][j]-)%);
else
H+=abs(i-)+abs(j-); return H;
} bool bfs()
{
priority_queue <state> que1,que2; int temp,t1[][],t2[][];
int tnum1,tnum2;
int x01,y01,x02,y02; state tsta1,tsta2;
int H,G1,G2; que1.push(state(,,Snum));
que2.push(state(,,Enum)); rem[Snum]=;
rem[Enum]=-; son[Enum]=Enum;
fa[Snum]=Snum; while(!que1.empty()&&!que2.empty())
{
tsta1=que1.top();
tsta2=que2.top();
que1.pop();
que2.pop(); tnum1=tsta1.num;
tnum2=tsta2.num;
G1=tsta1.G;
G2=tsta2.G; zhankai(t1,tnum1);
zhankai(t2,tnum2); for(int i=;i<;++i)
for(int j=;j<;++j)
{
if(t1[i][j]==)
x01=i,y01=j;
if(t2[i][j]==)
x02=i,y02=j;
} for(int i=;i<;++i)
{
if(judge(x01+step[i][],y01+step[i][])==)
continue; swap(t1[x01][y01],t1[x01+step[i][]][y01+step[i][]]);
temp=hebing(t1); if(rem[temp]==)
{
rem[temp]=i+;
fa[temp]=tnum1;
H=getH(t1);
que1.push(state(H+G1+,G1+,temp));
}
else if(rem[temp]<)
{
fa[temp]=tnum1;
Mrem=rem[temp];
rem[temp]=i+;
Mnum=temp; return ;
} swap(t1[x01][y01],t1[x01+step[i][]][y01+step[i][]]);
} for(int i=;i<;++i)
{
if(judge(x02+step[i][],y02+step[i][])==)
continue; swap(t2[x02][y02],t2[x02+step[i][]][y02+step[i][]]);
temp=hebing(t2); if(rem[temp]==)
{
rem[temp]=-(i+);
son[temp]=tnum2;
H=getH(t2);
que2.push(state(H+G2+,G2+,temp));
}
else if(rem[temp]>)
{
son[temp]=tnum2;
Mrem=-(i+);
Mnum=temp; return ;
} swap(t2[x02][y02],t2[x02+step[i][]][y02+step[i][]]);
}
} return ;
} bool JiOujian(int (*m)[])
{
int ni=; for(int i=;i<;++i)
for(int j=;j<i;++j)
if(m[i/][i%]&&m[j/][j%])
if(m[i/][i%]<m[j/][j%])
++ni; return ni%;
} void solve(int (*m)[])
{
if(JiOujian(m))
{
cout<<"unsolvable\n";
return;
} memset(rem,,sizeof(rem)); Snum=hebing(m); if(Snum==Enum)
{
cout<<endl;
return;
} if(bfs())
showans();
else
cout<<"unsolvable\n";
} int main()
{
ios::sync_with_stdio(false); int m[][];
char c; while(cin>>c)
{
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-'';
cin>>c;
m[][]=c=='x'?:c-''; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cin>>c;
m[i][j]=c=='x'?:c-'';
} solve(m);
} return ;
}
IDA*+剪枝。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std; const int maxn=;
const int Enum=;
const int jie[]={,,,,,,,,};
const int Step[][]={{,},{,-},{-,},{,}}; int ans[maxn];
int Deep;
int Node[][];
int x01,y01; void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
} bool judge()
{
for(int i=;i<;++i)
for(int j=;j<;++j)
if(Node[i][j]&&Node[i][j]!=i*+j+)
return ; return ;
} bool JiOujian()
{
int ni=; for(int i=;i<;++i)
for(int j=;j<i;++j)
if(Node[i/][i%]&&Node[j/][j%])
if(Node[i/][i%]<Node[j/][j%])
++ni; return ni%;
} int getH()
{
int reH=; for(int i=;i<;++i)
for(int j=;j<;++j)
if(Node[i][j])
reH+=abs(i-(Node[i][j]-)/)+abs(j-(Node[i][j]-)%);
else
reH+=abs(-i)+abs(-j); return reH;
} void showans(int G)
{
for(int i=;i<G;++i)
if(ans[i]==)
cout<<'d';
else if(ans[i]==)
cout<<'l';
else if(ans[i]==)
cout<<'u';
else
cout<<'r'; cout<<endl;
} bool judgeBian(int x,int y)
{
if(x<||y<||x>||y>)
return ; return ;
} bool dfs(int G,int lasStep)
{
int H=getH(); if(H+G>Deep)
return ; if(judge())
{
showans(G);
return ;
} for(int i=;i<;++i)
{
if(i%==lasStep%&&i!=lasStep)
continue; if(judgeBian(x01+Step[i][],y01+Step[i][])==)
continue; swap(Node[x01][y01],Node[x01+Step[i][]][y01+Step[i][]]);
x01+=Step[i][];
y01+=Step[i][]; ans[G]=i; if(dfs(G+,i))
return ; x01-=Step[i][];
y01-=Step[i][];
swap(Node[x01][y01],Node[x01+Step[i][]][y01+Step[i][]]);
} return ;
} void solve()
{
if(JiOujian())
{
cout<<"unsolvable\n";
return;
} Deep=; while()
{
if(dfs(,-))
return; ++Deep;
}
} int main()
{
ios::sync_with_stdio(false); char c; while(cin>>c)
{
Node[][]=c=='x'?:c-'';
cin>>c;
Node[][]=c=='x'?:c-'';
cin>>c;
Node[][]=c=='x'?:c-''; for(int i=;i<;++i)
for(int j=;j<;++j)
{
cin>>c;
Node[i][j]=c=='x'?:c-'';
} for(int i=;i<;++i)
for(int j=;j<;++j)
if(Node[i][j]==)
x01=i,y01=j; solve();
} return ;
}
(中等) HDU 1043 Eight,经典搜索问题。的更多相关文章
- hdu 1043(经典搜索)
题意: 给你一个初始的图,然后每次输入一个图,要求移动x最小的步数达到和初始图一样,输出路径 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 5 6 7 ...
- hdu 1043 Eight 经典八数码问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...
- HDU 1043 Eight 八数码问题 A*算法(经典问题)
HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...
- HDU - 1043 - Eight / POJ - 1077 - Eight
先上题目: Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)
思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...
- HDU 1043 Eight(八数码)
HDU 1043 Eight(八数码) 00 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Descr ...
- Eight POJ - 1077 HDU - 1043 八数码
Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...
- HDU 1043 Eight 【经典八数码输出路径/BFS/A*/康托展开】
本题有写法好几个写法,但主要思路是BFS: No.1 采用双向宽搜,分别从起始态和结束态进行宽搜,暴力判重.如果只进行单向会超时. No.2 采用hash进行判重,宽搜采用单向就可以AC. No.3 ...
- HDU 1043 八数码(A*搜索)
在学习八数码A*搜索问题的时候须要知道下面几个点: Hash:利用康托展开进行hash 康托展开主要就是依据一个序列求这个序列是第几大的序列. A*搜索:这里的启示函数就用两点之间的曼哈顿距离进行计算 ...
随机推荐
- php UNIX时间戳转换为指定日期格式
用函数: date() 一般形式:date('Y-m-d H:i:s', unix时间) $date_unix=time();//获取当前时间,unix时间戳 echo 'Unix时间:'.$date ...
- Clock Pictures
Clock Pictures 题目描述 You have two pictures of an unusual kind of clock. The clock has n hands, each h ...
- Automatic Trading
Automatic Trading A brokerage firm is interested in detecting automatic trading. They believe that a ...
- HDU2586 How far away ? 邻接表+DFS
题目大意:n个房子,m次询问.接下来给出n-1行数据,每行数据有u,v,w三个数,代表u到v的距离为w(双向),值得注意的是所修建的道路不会经过一座房子超过一次.m次询问,每次询问给出u,v求u,v之 ...
- linux command----vi
vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器.Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能. ...
- AngularJS 从零开始学习(一)
什么是AngularJS? AngularJS是一个把HTML(视图)绑定到JavaScript对象(模型)上的框架.当模型改变时,页面也能自动随之更新,反之亦然.当某个域的内容发生变化时,与之关联的 ...
- 转:浏览器与WEB服务器工作过程举例
用户通过“浏览器”访问因特网上的WEB服务器,浏览器和服务器之间的信息交换使用超文本传输协议(HTTP--HyperText Transfer Protocol). 例:用户访问东南大学主页 Http ...
- java项目中使用guava的工具包的心得
原文:http://www. zuidaima.com/blog/3182745969511424.htm 以前只是听过这个工具包,但是真正用的话还是在D75需求中.我要实现把前台传入的list集 ...
- hdu_5738_Eureka(脑洞)
题目链接:hdu_5738_Eureka 题意: 这题感觉说不清楚,坑点有点坑,一不小心就会推出错误的公式,然后最重要的是你还不知道你推错了 题解: 这里贴一个官方的题解 Eureka xjb推导一下 ...
- Memcached函数整理
public bool Memcached::add ( string $key , mixed $value [, int $expiration ] ) 向key中添加值,如果key存在,返回f ...