Poj3126

来源:互联网 发布:stm32f 输入端口写法 编辑:程序博客网 时间:2024/06/05 12:07

3126Accepted200K0MSC++1902B

bfs

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>//#pragma warning(disable:4996)using namespace std;const int MAX_N=10005;const int INF=0x3fffffff;bool isPrim[MAX_N];void createPrimTable(){    memset(isPrim,1,sizeof(isPrim));    isPrim[0]=isPrim[1]=false;    isPrim[2]=true;    for(int i=2;i*i<=10000;++i){        if(isPrim[i])            for(int j=i*i;j<10000;j+=i)                isPrim[j]=false;    }}int d[MAX_N];int dfs(int s,int g){    fill(d,d+MAX_N+1,INF);    queue<int> q;    q.push(s);    d[s]=0;    while(!q.empty()){        int p=q.front();q.pop();        if(p==g)    return d[p];        int thousandBit=p/1000;        int hundredBit=p/100-10*thousandBit;        int tenBit=(p%100)/10;        int oneBit=p%10;        for(int i=1;i<=9;i++){            int tmp=p-(thousandBit-i)*1000;            if(isPrim[tmp]&&d[tmp]==INF){                q.push(tmp);                d[tmp]=d[p]+1;            }        }        for(int i=0;i<=9;i++){            int tmp=p-(hundredBit-i)*100;            if(isPrim[tmp]&&d[tmp]==INF){                q.push(tmp);                d[tmp]=d[p]+1;            }        }        for(int i=0;i<=9;i++){            int tmp=p-(tenBit-i)*10;            if(isPrim[tmp]&&d[tmp]==INF){                q.push(tmp);                d[tmp]=d[p]+1;            }        }        for(int i=1;i<=9;i+=2){            int tmp=p-(oneBit-i)*1;            if(isPrim[tmp]&&d[tmp]==INF){                q.push(tmp);                d[tmp]=d[p]+1;            }        }    }    return d[g];}int main(){    createPrimTable();    int n;    scanf("%d",&n);    while(n--){        int s,g;        scanf("%d%d",&s,&g);        dfs(s,g);        if(d[g]!=INF)            printf("%d\n",d[g]);        else            printf("Impossible\n");    }    return 0;}


0 0
原创粉丝点击