复旦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; }
时间: 2024-12-06 02:03:02