题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195
搜索就三种规则, 一个是+1 一个是-1 还有一个是交换,用bfs搜索就行了,参照大神的思路。。。
代码:
#include <cstdio> #include <queue> #include <cstring> using namespace std; int a[5]; int b[5]; struct Node { int di[5]; int st; }; int v[10][10][10][10]; void bfs() { queue<Node> q; Node f; for(int i = 0; i < 4; ++i) f.di[i] = a[i]; f.st = 0; q.push(f); while(!q.empty()) { Node t = q.front(); q.pop(); int flag = 1; for(int i = 0; i < 4; ++i) { if(t.di[i] != b[i]) { flag = 0; break; } } if(flag) { printf("%d\n",t.st); return ; } Node p ; for(int i = 0; i < 4; ++i) // +1 { p = t; if(p.di[i] == 9) p.di[i] = 1; else p.di[i]++; p.st = t.st + 1; if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]]) { v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1; q.push(p); } } for(int i = 0; i < 4; ++i) // -1 { p = t; if(p.di[i] == 1) p.di[i] = 9; else p.di[i]--; p.st = t.st + 1; if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]]) { v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1; q.push(p); } } for(int i = 0; i < 3; ++i) //交换 { p = t; p.di[i] = t.di[i + 1]; p.di[i + 1] = t.di[i]; p.st = t.st + 1; if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]]) { v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1; q.push(p); } } } } int main() { int _; scanf("%d",&_); while(_--) { memset(v,0,sizeof(v)); char s[10],s1[10]; scanf("%s",s); for(int i = 0;i < 4;++i) a[i] = s[i] - '0'; scanf("%s",s1); for(int i = 0; i < 4; ++i) b[i] = s1[i] - '0'; bfs(); } }
时间: 2024-11-04 02:14:32