暂时弃坑,双向广搜太**难写了。。。。
https://www.luogu.org/problem/show?pid=1379
突然发现八数码难题挺有意思的
貌似关于这一个问题就能延伸出好多种算法
挖个坑,慢慢填2333
BFS+map
第一发
裸的BFS
1 #include2 #include 3 #include 4 #include 5 #include
第一次
第二次
第三次
慢的一逼。。
第二次TLE了5个点,,
表示实在无力吐槽啊。。。
我的代码有这么丑么???
不行!我要优化!!
BFS+map+常数优化
1 #include2 #include 3 #include 4 #include 5 #include
这次我把寻找0的位置的循环给去掉了,
用两个变量来记录0的位置,用空间换时间
第一次
第二次
第三次
WTF?????
卵用没有????
=.=。。。。。
=.=。。。。。,,,,
看来常数优化是没怎么有用了
尝试优化一下STL吧
BFS+hash
1 #include2 #include 3 #include 4 #include 5 #include
果断把map改成hash
老师说过map慢的一逼
第一次
第二次
第三次
O__O" O__O" O__O" O__O"
O__O" O__O" O__O" O__O"
O__O" O__O" O__O" O__O"
O__O" O__O" O__O" O__O"
O__O" O__O" O__O" O__O"
=.=...
发生了什么,,,我只不过是优化了一个理论上的log而已=.=。。
不会吧,,,,,
我以前可都是用map+string判重的。。。
我感觉我需要重新认识一下这个世界了。。。。
zhx老师说过倒着搜会有神奇的效果。
不如试一试?
BFS+hash+逆向搜索
1 #include2 #include 3 #include 4 #include 5 #include
时间复杂度应该是差不多的
看来需要从算法上进行优化了
A*
一种比较神奇的算法,关于他的介绍可以看http://blog.csdn.net/zgwangbo/article/details/52078338
对于这道题来说,我们可以枚举一个希望的值,再进行枚举
注意枚举的时候要用DFS,因为BFS不好记录状态
裸的A*
(无视ID)
雾。。。
和爆搜差不多,,,
我的代码有这么丑么。。。。
拆开结构体
貌似快了一些
把变量加到dfs的参数中
好像又快了一些。。。
但还是比估计的慢很多
真相大白
我去!!
我终于知道为什么慢了
我在取绝对值的时候是用的自己手写的fabs
用了algorithm库里面的之后快了接近300ms!
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 const int n=3; 8 inline void read(int &n) 9 { 10 char c=getchar();bool flag=0;n=0; 11 while(c<'0'||c>'9') c=='-'?flag=1,c=getchar():c=getchar(); 12 while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();flag==1?n=-n:n=n; 13 } 14 int xx[4]={0,1,-1,0}; 15 int yy[4]={1,0,0,-1}; 16 int fx[11]={0,1,1,1,2,3,3,3,2}; 17 int fy[11]={0,1,2,3,3,3,2,1,1};// fx[i] fy[j]表示的是目标状态下i数码的位置 18 int a[4][4]; 19 int check() 20 { 21 int now=0; 22 for(int i=1;i<=3;i++) 23 for(int j=1;j<=3;j++) 24 if(a[i][j]) 25 now+=abs(i-fx[a[i][j]])+abs(j-fy[a[i][j]]); 26 return now; 27 } 28 int ans=0; 29 void dfs(int k,int zerox,int zeroy,int step) 30 { 31 int h=check(); 32 if(h==0) 33 { 34 ans=step;return ; 35 } 36 if(h+step>k||ans||step==k) return ; 37 for(int i=0;i<4;i++) 38 { 39 int wx=zerox+xx[i]; 40 int wy=zeroy+yy[i]; 41 if(wx>=1&&wx<=n&&wy>=1&&wy<=n) 42 { 43 swap(a[zerox][zeroy],a[wx][wy]); 44 dfs(k,wx,wy,step+1); 45 swap(a[zerox][zeroy],a[wx][wy]); 46 } 47 } 48 } 49 int main() 50 { 51 int zerox,zeroy,k=0; 52 char c; 53 for(int i=1;i<=n;i++) 54 for(int j=1;j<=n;j++) 55 { scanf("%c",&c);a[i][j]=c-48; 56 if(c=='0') zerox=i,zeroy=j;} 57 while(++k&&ans==0) 58 dfs(k,zerox,zeroy,0); 59 printf("%d",ans); 60 return 0; 61 }