点击打开链接
好恶心的一道题,
给你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; }