hdu 1043 Eight(8数码,第三重)
来源:互联网 发布:马季打侯宝林真相知乎 编辑:程序博客网 时间:2024/05/29 11:50
小记:8数码境界还只有第三重,还要继续加油。
做法:第一重,stl + bfs 暴力, 9!数量级,在重复询问的状态下,超时是必然的
第二重,hash + bfs ,自己做hash函数,自己想个hash函数出来,hdu的5秒 这样做 应该能过,poj 1s 就算了
第三重,hash + 反向bfs + 打表, hash 我是用map做的, 同时用map记录表,因为是反向的,所以在询问某一个,要输出答案时,反向输出。
第四重,在想...
第一重代码:
#include <iostream>#include <map>#include <string>#include <queue>using namespace std;const int MAX_ = 10;int f[MAX_][MAX_];int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};char ss[4] = {'u','d','l','r'};struct point { int init[MAX_][MAX_]; int x,y; string str;} s;map<int,bool>mp;void bfs() { queue<point>q; s.str=""; q.push(s); mp.clear(); while(!q.empty()) { point cur, next; cur = q.front(); q.pop(); bool flag = 1; for(int i = 1; i < 4; ++i) { for(int j = 1; j < 4; ++j) { if(cur.init[i][j] != f[i][j]) { flag = 0; break; } } if(!flag)break; } if(flag) { //show(cur); cout<<cur.str<<endl; return; } for(int i = 0; i < 4; ++i) { next.x = cur.x + dir[i][0]; next.y = cur.y + dir[i][1]; if((next.x >= 1 && next.x <= 3) &&(next.y >= 1 && next.y <= 3)) { for(int k = 1; k < 4; ++k) { for(int j = 1; j < 4; ++j) { next.init[k][j] = cur.init[k][j]; } } swap(next.init[next.x][next.y],next.init[cur.x][cur.y]); next.str = cur.str; next.str.push_back(ss[i]); int cnt = 0; for(int k =1; k < 4; ++k) { for(int j = 1; j < 4; ++j) { cnt = cnt*10 + next.init[k][j]; } } if(mp.find(cnt) == mp.end()) { mp[cnt] = 1; q.push(next); } } } } cout<<"unsolvable"<<endl;}int main() { char c; int sx,sy; while(cin>>c) { c == 'x'?s.init[1][1] = 0:s.init[1][1] = c- '0'; for(int i = 2; i < 4; ++i) { cin>> c; c == 'x'?s.init[1][i] = 0:s.init[1][i] = c - '0'; } for(int i = 2; i < 4; ++i) { for(int j = 1; j < 4; ++ j) { cin>>c; c == 'x'?s.init[i][j] = 0:s.init[i][j] = c - '0'; } } for(int i = 1; i < 4; ++i) { for(int j = 1; j < 4; ++ j) { if(s.init[i][j] == 0) { s.x = i, s.y = j; } } } int cnt = 1; for(int i = 1; i < 4; ++i) { for(int j = 1; j < 4; ++j) { f[i][j] = cnt++; cnt %= 9; } } bfs(); } return 0;}
第二重,懒得想了,
直接第三重:
#include <iostream>#include <map>#include <string>#include <queue>#include <algorithm>using namespace std;const int MAX_ = 10;int f[MAX_][MAX_];int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};char ss[4] = {'d','u','r','l'};struct point { int init[MAX_][MAX_]; int x,y; string str;} s;map<int,string>mp;void bfs() { queue<point>q; s.str=""; q.push(s); mp.clear(); while(!q.empty()) { point cur, next; cur = q.front(); q.pop(); for(int i = 0; i < 4; ++i) { next.x = cur.x + dir[i][0]; next.y = cur.y + dir[i][1]; if((next.x >= 1 && next.x <= 3) &&(next.y >= 1 && next.y <= 3)) { for(int k = 1; k < 4; ++k) { for(int j = 1; j < 4; ++j) { next.init[k][j] = cur.init[k][j]; } } swap(next.init[next.x][next.y],next.init[cur.x][cur.y]); next.str = cur.str; next.str.push_back(ss[i]); int cnt = 0; for(int k =1; k < 4; ++k) { for(int j = 1; j < 4; ++j) { cnt = cnt*10 + next.init[k][j]; } } if(mp.find(cnt) == mp.end()) { mp[cnt] = next.str; q.push(next); } } } }}int main() { char c; int sx,sy; int cnt = 1; for(int i = 1; i < 4; ++i) { for(int j = 1; j < 4; ++j) { s.init[i][j] = cnt++; cnt %= 9; } } s.x = 3, s.y = 3; bfs(); while(cin>>c) { c == 'x'?f[1][1] = 0:f[1][1] = c- '0'; for(int i = 2; i < 4; ++i) { cin>> c; c == 'x'?f[1][i] = 0:f[1][i] = c - '0'; } for(int i = 2; i < 4; ++i) { for(int j = 1; j < 4; ++ j) { cin>>c; c == 'x'?f[i][j] = 0:f[i][j] = c - '0'; } } int cnt = 0; for(int k =1; k < 4; ++k) { for(int j = 1; j < 4; ++j) { cnt = cnt*10 + f[k][j]; } } if(mp.find(cnt) == mp.end()) { cout<<"unsolvable"<<endl; } else { reverse(mp[cnt].begin(),mp[cnt].end()); cout<<mp[cnt]<<endl; } } return 0;}
0 0
- hdu 1043 Eight(8数码,第三重)
- HDU 1043 eight 八数码
- 八数码--HDU - 1043 Eight
- HDU 1043 Eight 八数码
- hdu 1043 eight 八数码问题
- HDU-1043 Eight 八数码问题
- hdu 1043 Eight(八数码)
- hdu 1043 Eight 经典八数码问题
- HDU 1043 eight (Astar 八数码)
- HDU 1043 Eight ((八数码问题)逆向BFS + 康托定理判重)
- HDU 1043 Eight(八数码第三境界|广搜+哈希+打表)
- hdu 1043 eight 八数码问题 bfs 和 A*
- hdu 1043 poj 1077 Eight Time (搜索&八数码)
- HDU 1043 / POJ 1077 Eight(八数码问题)
- HDU 1043 Eight 八数码问题 A*搜索 启发式算法
- HDU 1043 Eight poj 1077 (八数码 启发式搜索)
- POJ 1077(HDU 1043)Eight(八数码DBFS)
- hdu 1043 Eight(八数码问题 高级搜索: A* 搜索)
- 将来收到此错误。
- 渐变-QLinearGradient,QRadialGradient,QConicalGradient)
- git merge abort解决
- JSP/Servlet 工作原理(转载)
- 的确是这样。
- hdu 1043 Eight(8数码,第三重)
- 在Makefile中进行宏定义-D
- 什么是Amazon.s3
- C++之数据结构
- servlet和servlet容器
- Yahoo! 35条网站性能优化建议
- linux配置IP的方法
- 循序渐进企业级搜索引擎之Master模块设计及实现-系统加载
- Firefox中text-align=center的解决