这个题目把代码打完以后,真心觉得蛋疼。不知道改了多久,构建的蛇形二维数组一直有问题。。。
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int q[150][150],w[30000],r[150][150];
int n,m;
int c,d;
struct node{
int a,b;
int pri;
bool operator<(const node &t) const{
return pri>t.pri;
}
};
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int bfs(int x,int y){
priority_queue<node> que;
node in,out;
int e,f,i;
in.a=x;
in.b=y;
in.pri=0;
r[x][y]=1;
que.push(in);
while(que.size() != 0){
out=que.top();
que.pop();
if(out.a==c && out.b == d){
return out.pri;
}
for(i=0;i<4;i++){
e=out.a+dir[i][0];
f=out.b+dir[i][1];
if(q[e][f]!=0 && r[e][f]==0&&e>=0 &&f>=0 &&e<150 &&f<150 && w[q[e][f]]==1){
in.a=e;
in.b=f;
in.pri=out.pri+1;
r[e][f]=1;
que.push(in);
}
}
}
return 0;
}
int main(){
int i,j,ant,sum;
int a,b;
memset(q,-1,sizeof(q));
memset(w,0,sizeof(w));
w[1]=1;
for(i=2;i<=150;i++){
if(w[i]==0)
for(j=2*i;j<=25000;j=j+i){
w[j]=1;
}
}
ant=22499;
q[0][0]=22500;
i=0;j=0;
while(ant>=1){ //这个蛇形填数第一次使用,记住吧!!!
while(j+1<150 && q[i][j+1]==-1){
q[i][++j]=ant;
ant--;
}
while(i+1<150 && q[i+1][j]==-1){
q[++i][j]=ant;
ant--;
}
while(j-1>=0 && q[i][j-1]==-1){
q[i][--j]=ant;
ant--;
}
while(i-1>=0 && q[i-1][j]==-1){
q[--i][j]=ant;
ant--;
}
}
//printf("_____%d\n",q[i][j]);
ant=1;
while(~scanf("%d%d",&n,&m)){
memset(r,0,sizeof(r));
for(i=0;i<150;i++){
for(j=0;j<150;j++){
if(q[i][j] == n){
a=i;
b=j;
}
if(q[i][j] == m){
c=i;
d=j;
}
}
}
//printf("%d %d %d %d\n",a,b,c,d);
sum=bfs(a,b);
printf("Case %d: ",ant++);
if(sum == 0) printf("impossible\n");
else printf("%d\n",sum);
}
return 0;
}