首页 > 代码库 > hdu 4255 含限制条件的广搜

hdu 4255 含限制条件的广搜

复旦2012机试题

#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<algorithm>using namespace std;int g[210][210],vis[210][210];int dir[4][2]={0,1,-1,0,0,-1,1,0};int isprime(int n){    for(int i=2;i<=sqrt(n);i++){        if(n%i==0) return 0;    }    return 1;}pair<int,int> pos[10005];void init(){    g[100][100]=1;    int x=100,y=100;    int len=2,val=1;    int d=0;    pos[val]=make_pair(x,y);    while(len<=105){        for(int i=1;i<len;i++){            x=x+dir[d][0];y=y+dir[d][1];            val++;            if(isprime(val)) g[x][y]=0;            else{                g[x][y]=val;                if(val<=10000)                pos[val]=make_pair(x,y);            }         }        d=(d+1)%4;        for(int i=1;i<len;i++){            x=x+dir[d][0];y=y+dir[d][1];            val++;            if(isprime(val)) g[x][y]=0;            else{                g[x][y]=val;                if(val<=10000)                pos[val]=make_pair(x,y);            }        }        d=(d+1)%4;        len++;    }}int bfs(int st,int ed){    queue<pair<int,int> > q;    q.push(pos[st]);    while(!q.empty()){        pair<int,int> p=q.front();        q.pop();        for(int i=0;i<4;i++){            int nx=p.first+dir[i][0],ny=p.second+dir[i][1];            if(vis[nx][ny]||g[nx][ny]==0) continue;            vis[nx][ny]=vis[p.first][p.second]+1;            if(g[nx][ny]==ed) return vis[nx][ny];            q.push(make_pair(nx,ny));        }    }    return -1;    }int main(){    int n,m,kcase=0;    init();    while(scanf("%d%d",&n,&m)!=EOF){        kcase++;        printf("Case %d: ",kcase);        memset(vis,0,sizeof(vis));        if(n==m){            printf("0\n");continue;        }        int ans=bfs(n,m);        if(ans==-1){            printf("impossible\n");        }            else{            printf("%d\n",ans);        }    }/**/    return 0;}

 

hdu 4255 含限制条件的广搜