标签:amp str 一个 pop efi size cout oid strlen
我真的服了, bfs+康拓展开,当然,这是比较低级的做法,今后我再更新其他的做法
八位数问题好像还是挺有名的
题目就是给你一个3*3的矩阵里面填装这 1-8的数字 空了一个格子,我们的目的就是让这个矩阵排列成
1 2 3
4 5 6
7 8 x x是空出来的
方法一:把 x看成9,从1 2 3 4 5 6 7 8 9,搜索所有的状态,记录到达所有状态的路径,输入一个起始状态,直接输出路径
这是最蠢的办法,我看到网上有很多A*,双向bfs的,深感自己的弱小
(我一开始用的map超时)
#include<iostream> #include<queue> #include<cstring> #include<vector> #include<cstdio> #include<cmath> #include<map> #include<string> using namespace std; #define ll long long #define se second #define fi first #define oo 0x3fffffff const int maxn = 400000; bool hashs[maxn]; string path[maxn]; int fac[]={1,1,2,6,24,120,720,5040,40320,362880}; int dx[4] = {1,-1,0,0}; int dy[4] = {0,0,1,-1}; char op[5] = "udlr"; struct node { int s[9]; int pos; int val; string path; }; int tocon(int a[]) { int x = 0; for(int i = 0; i <= 8; ++i) { int k = 0; for(int j = i+1; j <= 8; ++j) if(a[j] > a[i]) k ++; x += k*fac[9-i-1]; } return x; } void bfs() { int num[9]; memset(hashs,0,sizeof(hashs)); node st,ed; for(int i = 0; i < 9; ++i) st.s[i] = i+1; st.val = tocon(st.s); st.path = ""; path[st.val] = ""; hashs[st.val] = true; st.pos = 8; queue<node> q; q.push(st); while(!q.empty()) { st = q.front(); q.pop(); for(int i = 0; i < 4; ++i) { int xx = st.pos/3+dx[i]; int yy = st.pos%3+dy[i]; if(xx >= 0 && xx <= 2 && yy >= 0 && yy <= 2) { ed.pos = xx*3 + yy; for(int i = 0; i < 9; ++i) ed.s[i] = st.s[i]; //for(int i = 0 ; i < 9; ++i) // cout << ed.s[i]; //cout << endl; swap(ed.s[ed.pos],ed.s[st.pos]); ed.val = tocon(ed.s); if(!hashs[ed.val]) { hashs[ed.val] = true; ed.path = op[i] + st.path; path[ed.val] = ed.path; q.push(ed); } } } } } int main() { char str[150]; bfs(); while(gets(str)) { int s[9]; int l = 0; for(int i = 0; i < strlen(str); ++i) { if(str[i] <= ‘9‘ && str[i] >= ‘0‘) s[l++] = str[i] - ‘0‘; else if(str[i] == ‘x‘) s[l++] = 9; } int k = tocon(s); if(hashs[k]) cout << path[k] << endl; else cout << "unsolvable" << endl; } }
标签:amp str 一个 pop efi size cout oid strlen
原文地址:https://www.cnblogs.com/mltang/p/9742744.html