首页 > 代码库 > 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 含限制条件的广搜
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。