题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4255
题目的数据是10000以内的,但是要建400*400的矩阵用一次bfs就可以完成
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 int ma[410][410]={0},vis[410][410],dist[410][410],mb[410][410];//mb储存数字,ma储存素数 5 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; 6 int q[410*410];//队列数组 7 int isprime(int n) 8 { 9 int i;if(n==1)return 0; 10 for(i=2;i<=(int)sqrt((double)n);i++) 11 if(n%i==0)return 0; 12 return 1; 13 } 14 void jx()//建立矩形,大小为400*400 15 { 16 memset(ma,0,sizeof(ma)); 17 int i=0,j,key=160000; 18 while(key>=1){ 19 for(j=i;j<400-i-1;j++){//从左向右 20 mb[i][j]=key--;if(isprime(mb[i][j]))ma[i][j]=key+1; 21 } 22 for(j=i;j<400-i-1;j++){//从上往下 23 mb[j][400-i-1]=key--;if(isprime(mb[j][400-i-1]))ma[j][400-i-1]=1+key; 24 } 25 for(j=400-i-1;j>i;j--){//从右往左 26 mb[400-1-i][j]=key--;if(isprime(mb[399-i][j]))ma[399-i][j]=1+key; 27 } 28 for(j=400-1-i;j>i;j--){//从下往上 29 mb[j][i]=key--;if(isprime(mb[j][i]))ma[j][i]=1+key; 30 } 31 i++; 32 } 33 } 34 void bfs(int x,int y,int nn)//,BFS搜索,nn是目标数据 35 { 36 memset(vis,0,sizeof(vis));//标记数组,先全部清0 37 memset(dist,0,sizeof(dist));//距离数组,记录每一点到初始位置的距离 38 memset(q,0,sizeof(q));//队列数组 39 vis[x][y]=1; 40 int u=x*400+y; 41 int front=0,rear=0; 42 q[rear++]=u; 43 while(front<rear) 44 { 45 u=q[front++];//取队列头位置的数 46 x=u/400;y=u%400; 47 for(int i=0;i<4;i++) 48 { 49 int nx=x+dx[i],ny=y+dy[i]; 50 if(nx>=0&&nx<400&&ny>=0&&ny<400&&!ma[nx][ny]&&!vis[nx][ny]) 51 { 52 vis[nx][ny]=1; 53 q[rear++]=nx*400+ny;//放入队列尾 54 dist[nx][ny]=dist[x][y]+1;//距离加1 55 if(mb[nx][ny]==nn)return;//一旦找到立刻停止搜索 56 } 57 } 58 } 59 } 60 int main() 61 { 62 jx(); 63 int m,n,num=1; 64 while(~scanf("%d%d",&m,&n)) 65 { 66 int x,y,xx,yy,count=0; 67 printf("Case %d: ",num++); 68 for(int i=0;count<2&&i<400;i++)//找到开始的位置 69 for(int j=0;j<400;j++) 70 { 71 if(mb[i][j]==m)x=i,y=j,count++; 72 if(mb[i][j]==n)xx=i,yy=j,count++; 73 } 74 bfs(x,y,n);//搜索 75 if(dist[xx][yy])printf("%d\n",dist[xx][yy]); 76 else printf("impossible\n"); 77 } 78 return 0; 79 }