标签:bfs
题意:给你一个4位数,再给你一个4位数,如前一个数的每次只移动一位,问你能不能将第一个数变成第二个。
转移条件:1,只能通过素数作为中转,2,每次移动一位.
如果找到输出最少的转移次数(或步数), 如果找不到输出Impossible。
策略:如题。
直接上代码:
#include<stdio.h> #include<string.h> #include<queue> #define M 10005 using std::queue; int vis[10000]; int prime[10005] = {1, 1}; struct node{ int v[5]; int step; }; node st, en; queue<node> q; void f() //找到10000以内的素数 { int i, j; for(i = 2; i < 10005; i ++){ if(prime[i] == 0){ for(j = i+i; j < M; j += i){ prime[j] = 1; } } } } int match(node s1, node s2) { int i; for(i = 0; i < 4; i ++){ if(s1.v[i] != s2.v[i]) return false; } return true; } int bfs() { memset(vis, 0, sizeof(vis)); int i, j, ans = 0x3f3f3f3f; q.push(st); int temp = st.v[0]*1000+st.v[1]*100+st.v[2]*10+st.v[3]; vis[temp] = 1; while(!q.empty()){ node u = q.front(); if(match(u, en)){ ans = u.step; break; } for(i = 0; i < 4; i ++){ j = 0; if(i == 0){ j = 1; } for(; j <= 9; j ++){ node v = u; v.v[i] = j; v.step = u.step+1; temp = v.v[0]*1000+v.v[1]*100+v.v[2]*10+v.v[3]; /*if(match(v, en)){ return v.step; }*/ if(!vis[temp]&&prime[temp] == 0){ vis[temp] = 1; //printf("%d..", temp); q.push(v); } } } q.pop(); } while(!q.empty()) q.pop(); return ans; } int main() { f(); char s1[5], s2[5]; int t, i, j; scanf("%d", &t); while(t --){ scanf("%s %s", s1, s2); for(i = 0; i < strlen(s1); i ++){ st.v[i] = s1[i]-'0'; } st.step = 0; for(i = 0; i < strlen(s2); i ++){ en.v[i] = s2[i]-'0'; } int ans = bfs(); if(ans != 0x3f3f3f3f) printf("%d\n", ans); else printf("Impossible\n"); } }
poj 3126 Prime Path 【暴力BFS】,布布扣,bubuko.com
标签:bfs
原文地址:http://blog.csdn.net/shengweisong/article/details/38587463