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;
}