UVA10085宽搜之八宫格走最远
2016-03-02 21:24
309 查看
刚开始以为直接宽搜会超时,并不会,直接宽搜,打印路径的话,开个数组记录子节点的父节点,再开一个数组
记录父节点到子节点的方向,然后递归就行了。
记录父节点到子节点的方向,然后递归就行了。
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<string> #include<set> #include<map> #include<iostream> #include<algorithm> using namespace std; const int maxn=1e6; int t; set<int> s; int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}; int st[maxn][10]; int fa[maxn],path[maxn]; int ans; char ss[5]="UDLR"; bool insert(int *cup) { int sum=0; for(int i=0;i<9;i++){ sum=sum*10+cup[i]; } if(s.count(sum)) return 0; s.insert(sum); return 1; } void bfs(){ int front=0,rear=1; while(front<rear){ int zx,zy; for(int i=0;i<9;i++){ if(!st[front][i]){ zx=i/3,zy =i%3; break; } } for(int i=0;i<4;i++){ int tx,ty; tx=zx+dx[i]; ty=zy+dy[i]; if(tx>=0&&tx<3&&ty>=0&&ty<3){ memcpy(st[rear],st[front],sizeof(st[front])); st[rear][zx*3+zy]=st[front][tx*3+ty]; st[rear][tx*3+ty]=st[front][zx*3+zy]; if(insert(st[rear])){ fa[rear]=front; path[rear]=i; rear++; } } } front++; } ans=rear-1; } void print(int cur) { if(cur!=0){ print(fa[cur]); printf("%c",ss[path[cur]]); } } int main() { cin>>t; int k=0; while(t--){ for(int i=0;i<9;i++) cin>>st[0][i]; s.clear(); insert(st[0]); bfs(); cout<<"Puzzle #"<<++k<<endl; for(int i=0;i<3;i++) cout<<st[ans][0+i*3]<<' '<<st[ans][1+i*3]<<' '<<st[ans][2+i*3]<<endl; print(ans); cout<<endl<<endl; } }
相关文章推荐
- MySQL 慢查询日志
- JAVA学习第三十课(经常使用对象API)- String类:类方法练习
- iOS实践04
- 三层交换机静态路由配置实现两网互通
- 对fork()父子进程的一些理解
- 关于vsftp出现Restarting vsftpd (via systemctl): Job for vsftpd.service failed because the control 的解决办法
- java线程基础知识
- 12C ORA-错误汇总1 ORA-00000 to ORA-00877
- MLE与MAP
- 能量项链
- IOS9以上系统请求http报错
- 局域网什么的
- 再识M4—F429
- Android图片缓存及内存溢出
- 结构体嵌套对齐
- web跨域的解决方法总结
- 传统框架云化迁移到内存数据平台
- 2本地搭建服务器
- P103 Dijkstra算法 单源最短路问题优化算法
- eclipse快捷键大全