蓝桥杯-历届试题-九宫重排-BFS+剪枝
来源:互联网 发布:阿里巴巴农村淘宝加盟 编辑:程序博客网 时间:2024/05/22 06:47
题解:直接BFS,判重剪枝优化一下就行。
我看了网上一些题解,一些都是用字符串储存然后转化为整数判重。然后我觉得还是直接用字符串判重简单些,每想到还真过了。就是数据很极限,都900多ms,差点就超时了。
基本没什么说的,就BFS,然后map判重剪一下枝就过了。
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <queue>#include <map>using namespace std;const int INF = 0x3f3f3f3f;int xx[4]={0,0,1,-1};int yy[4]={1,-1,0,0};map<string,int>mp;struct node{ char sz[3][3]; int step,x,y;};int main(){ string start,finally,tmp; node n,x; int ans=INF,num=0; cin>>start>>finally; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { n.sz[i][j] = start[num++]; if(n.sz[i][j]=='.') { n.x = i; n.y = j; } } n.step=0; queue<node>q; q.push(n); mp[start]++; while(!q.empty()) { n=q.front(),q.pop(); for(int i=0;i<4;i++) { x = n; x.x = n.x+xx[i]; x.y = n.y+yy[i]; if(x.x<0 || x.x>2 || x.y<0 || x.y>2) continue; x.step = n.step+1; x.sz[n.x][n.y] = x.sz[x.x][x.y]; x.sz[x.x][x.y] = '.'; tmp = ""; for(int j=0;j<3;j++) { for(int k=0;k<3;k++) { tmp += x.sz[j][k]; } } if(tmp==finally) { if(x.step<ans) ans=x.step; continue; } if(!mp[tmp]) { mp[tmp]++; q.push(x); } } } if(ans==INF) printf("-1\n"); else printf("%d\n",ans); return 0;}
0 0
- 蓝桥杯-历届试题-九宫重排-BFS+剪枝
- 蓝桥杯 历届试题 九宫重排 BFS Java
- 蓝桥杯 历届试题-九宫重排
- 蓝桥杯 历届试题 九宫重排
- 蓝桥杯 历届试题 九宫重排
- 历届试题 九宫重排 蓝桥杯
- 蓝桥杯【历届试题】九宫重排
- 蓝桥杯历届试题——九宫重排(bfs)
- 历届试题 九宫重排 (bfs 康托判重)
- 历届试题 九宫重排
- 历届试题 九宫重排
- 蓝桥杯 历届试题 九宫重排 解题报告(BFS,双向BFS优化)
- 历届试题 九宫重排 (bfs 八数码问题)
- 蓝桥杯 历届试题 九宫重排 (八数码问题--康托展开去重 + bfs搜索)
- 蓝桥网 历届试题 九宫重排
- 蓝桥杯, 历届试题 九宫重排 (八数码)
- 蓝桥杯 历届试题 九宫重排(双向搜索优化)
- 蓝桥杯 历届试题 九宫重排 (广搜)
- vim下的一些设置
- Sequence to Sequence 模型
- 浅谈AVL树,红黑树,B树,B+树原理及应用
- VS2010 中更改项目名称
- Linux常用命令的操作
- 蓝桥杯-历届试题-九宫重排-BFS+剪枝
- autotools工具使用说明
- vc2012/2015 编译使用directshow
- 数组的指针操作
- jquery选择器中使用变量
- Qt精彩实例1
- Java Map 排序定义
- 欢迎使用CSDN-markdown编辑器
- HTTP Status 405