好恶心的一道题,
给你x,y都小于等于10000,但是可以通过这个范围之外的点走。。。。开到200就可以了。。
写的很乱。。。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"queue"
using namespace std;
#define N 400
int map[N][N];
int prime[N*N];
int mark[40001];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
struct node
{
int x,y,t;
}p,q;
int judge(int x,int y)
{
if(x>=1&&y<=400&&y>=1&&y<=400&&prime[map[x][y]]==1)
return 1;
return 0;
}
int s,e;
int sx,sy;
int ex,ey;
void init()
{
memset(map,0,sizeof(map));
int i,j,k,t,l,o;
i=200;j=200;
map[i][j]=1;
k=2;t=0;l=0;
while(k<=40000)
{
if(t==0)
{
l++;
o=1;
while(o<=l)
{
map[i][j+o]=k++;
o++;
}
o--;
j=j+o;
}
else if(t==1)
{
o=1;
while(o<=l)
{
map[i-o][j]=k++;
o++;
}
o--;
i=i-o;
}
else if(t==2)
{
l++;
o=1;
while(o<=l)
{
map[i][j-o]=k++;
o++;
}
o--;
j=j-o;
}
else
{
o=1;
while(o<=l)
{
map[i+o][j]=k++;
o++;
}
o--;
i=i+o;
}
if(k>40000)break;
t++;
t%=4;
}
/*
printf("%d\n",k);
for(i=190;i<=210;i++)
{
for(j=190;j<=210;j++)
printf("%6d",map[i][j]);
printf("\n");
}
*/
}
void fun()
{
memset(prime,0,sizeof(prime));
prime[1]=1;
int i,j;
for(i=2;i<=40000;i++)
{
if(!prime[i])
for(j=i+i;j<=40000;j+=i)
prime[j]=1;
}
}
void bfs()
{
int i,x,y;
queue<node>Q;
p.x=sx;
p.y=sy;
p.t=0;
Q.push(p);
memset(mark,0,sizeof(mark));
mark[map[sx][sy]]=1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(p.x==ex&&p.y==ey)
{
printf("%d\n",p.t);
return ;
}
for(i=0;i<4;i++)
{
x=q.x=p.x+dir[i][0];
y=q.y=p.y+dir[i][1];
if(judge(x,y)&&mark[map[x][y]]==0)
{
mark[map[x][y]]=1;
q.t=p.t+1;
Q.push(q);
}
}
}
printf("impossible\n");
}
int main()
{
memset(map,0,sizeof(map));
init();
fun();
int t=1;
while(scanf("%d%d",&s,&e)!=-1)
{
int i,j;
sx=sy=0;
ex=ey=0;
for(i=1;i<=400;i++)
{
for(j=1;j<=400;j++)
{
if(map[i][j]==s&&!sx&&!sy)sx=i,sy=j;
if(map[i][j]==e&&!ex&&!ey)ex=i,ey=j;
}
}
// printf("%d %d\n",sx,sy);
// printf("%d %d\n",ex,ey);
printf("Case %d: ",t++);
bfs();
}
return 0;
}