POJ 3126 Prime Path BFS 广度优先搜索 素数

来源:互联网 发布:java平台下载 编辑:程序博客网 时间:2024/06/08 06:13
/*---------------------------------------    stratege : 素数判断(先打表), BFS    Author : Johnsondu    Problem: 3126User: a312745658    Memory: 276KTime: 47MS    Language: C++Result: Accepted----------------------------------------*/#include <iostream>#include <cstdio>#include <queue>#include <cstring>#include <algorithm>using namespace std ;int a[10000] ;int x, y ;bool mark[10000] ;bool flag ;int num ;struct Node{    int t, h, d, s ;  //千位,百位,十位和各位    int step, cnt ;   //step记录时间,cnt 表示当前数}cur, next ;//初始化void init (){    flag = false ;    memset (mark, false, sizeof(mark)) ;}void BFS (){    int i, j, k ;    cur.t = x / 1000 ;    cur.h = x % 1000 / 100 ;    cur.d = x % 100 / 10 ;    cur.s = x % 10 ;    cur.step = 0 ;    cur.cnt = x ;    queue <Node> Q ;    Q.push (cur) ;    mark[cur.cnt] = true ;    while (!Q.empty())    {        cur = Q.front () ;        Q.pop () ;        if (cur.cnt == y)        {            flag = true ;            num = cur.step ;            while (!Q.empty())                Q.pop () ;            return ;        }        for (i = 1; i < 10; i ++)    //千位,注意不能为0,故循环从1开始,其他位从0开始        {            if (cur.t != i)            {                next.t =  i ;                next.h =  cur.h  ;                next.d = cur.d ;                next.s = cur.s ;                next.cnt = next.t*1000 + next.h*100 + next.d*10 + next.s ;                if (a[next.cnt] == 0 && !mark[next.cnt])  //next.cnt 是素数,且以前没走过                {                    mark[next.cnt] = true ;                    next.step = cur.step + 1;                    Q.push (next) ;                }            }        }        for (i = 0; i < 10; i ++)        {            if (cur.h != i)            {                next.t = cur.t ;                next.h = i ;                next.d = cur.d ;                next.s = cur.s ;                next.cnt = next.t*1000 + next.h*100 + next.d*10 + next.s ;                if (a[next.cnt] == 0 && !mark[next.cnt])                {                    mark[next.cnt] = true ;                    next.step = cur.step + 1;                    Q.push (next) ;                }            }        }        for (i = 0; i < 10; i ++)        {            if (cur.d != i)            {                next.t = cur.t ;                next.h = cur.h ;                next.d = i ;                next.s = cur.s ;                next.cnt = next.t*1000 + next.h*100 + next.d*10 + next.s ;                if (a[next.cnt] == 0 && !mark[next.cnt])                {                    mark[next.cnt] = true ;                    next.step = cur.step + 1;                    Q.push (next) ;                }            }        }        for (i = 0; i < 10; i ++)        {            if (cur.s != i)            {                next.t = cur.t ;                next.h = cur.h ;                next.d = cur.d ;                next.s = i ;                next.cnt = next.t*1000 + next.h*100 + next.d*10 + next.s ;                if (a[next.cnt] == 0 && !mark[next.cnt])                {                    mark[next.cnt] = true ;                    next.step = cur.step + 1;                    Q.push (next) ;                }            }        }    }}int main(){    int i, j, k, tmp ;    int  tcase, ans ;    memset (a, 0, sizeof(a)) ;        //素数标记    for (i = 2; i < 10000; i ++)    {        if (a[i] == 0)        {            tmp = 2 * i ;            while (tmp < 10000)            {                a[tmp] = 1 ;                tmp += i ;            }        }    }    cin >> tcase ;    while (tcase --)    {        cin >> x >> y ;        init () ;        BFS () ;        if (flag)            printf ("%d\n", num) ;        else            printf ("Impossible\n") ;    }    return 0 ;}

原创粉丝点击