http://poj.org/problem?id=3126
(1)简单的bfs,注意千位不能为0,其他位置可以为0 。(写时没有充分注意这一点,而且也没有养成足够强的修改代码的能力)。
具体代码:
View Code
#include<stdio.h> #include<math.h> #include<string.h> #include<queue> using namespace std; int a, b, flag; int mark[12000]; struct node { int n, t; }e, s; int is_prime(int n) { int i, m=sqrt(n); if(n==1) return 0; for(i=2;i<=m;i++) if(n%i==0) return 0; return 1; } int bfs() { int i, j, k; memset(mark, 0, sizeof(mark)); mark[a]=1; queue<node>q; while(!q.empty()) q.pop(); e.n=a, e.t=0; q.push(e); while(!q.empty()) { e=q.front(); q.pop(); if(e.n==b) {flag=1; break;} int digit[5], tn=e.n; for(i=1;i<=4;i++) { digit[i]=tn%10; tn/=10; } for(i=1;i<=9;i++) //千位 if(i!=digit[4]) { s.n=e.n-digit[4]*1000+i*1000; s.t=e.t+1; if(!mark[s.n]&&is_prime(s.n)) {q.push(s); mark[s.n]=1;} } for(i=0;i<=9;i++) //百位 if(i!=digit[3]) { s.n=e.n-digit[3]*100+i*100; s.t=e.t+1; if(!mark[s.n]&&is_prime(s.n)) {q.push(s); mark[s.n]=1;} } for(i=0;i<=9;i++) if(i!=digit[2]) //十位 { s.n=e.n-digit[2]*10+i*10; s.t=e.t+1; if(!mark[s.n]&&is_prime(s.n)) {q.push(s); mark[s.n]=1;} } for(i=0;i<=9;i++) //个位 if(i!=digit[1]) { s.n=e.n-digit[1]+i; s.t=e.t+1; if(!mark[s.n]&&is_prime(s.n)) {q.push(s); mark[s.n]=1;} } } if(flag) printf("%d\n", e.t); else printf("Impossible\n"); return 0; } int main() { int i, j, t; while(scanf("%d", &t)!=EOF) { while(t--) { scanf("%d%d", &a, &b); if(a==b) {printf("0\n"); continue;} flag=0; bfs(); } } return 0; }
