B先生最近发现了名为“螺旋网格”的网格。
如下图所示构建网格。(网格实际上是无限的。该图只是其中的一小部分。)
![](http://acm.hdu.edu.cn/data/images/C410-1011-1.jpg)
考虑到在其中旅行,您可以自由使用任何包含复数或1的单元格,但不允许旅行到包含质数的任何单元格。您可以向上,向下,向左或向右行驶,但不能沿对角线行驶。编写程序以查找成对的非素数之间的最短路径的长度,或者报告这是不可能的。
![](http://acm.hdu.edu.cn/data/images/C410-1011-2.jpg)
输入项
每个测试用例都由包含两个非素数整数1 <= x,y <= 10,000的输入行描述。
输出量
对于每个测试用例,在一行中显示其用例编号,后跟最短路径或“不可能”(不带引号)的长度。
题意:
就是给你两个数,在一个螺旋矩阵中只能走不是素数的格子,问你走过去的最短路,如果不能走过去就输出impossible
解法:
就是BFS+螺旋矩阵
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int maxx=6e4+10; int map[301][301]; int vis[300][300]; int biaoji[maxx]; const int maxn=5e4+100; //void getprime(){ // memset(prime,1,sizeof(prime)); // prime[1]=0; // for(int i=2;i<40010;i++){ // if(prime[i]){ // for(int j=i*i;j<40010;j+=i){ // prime[j]=0; // } // } // } //} void getprime(){ memset(biaoji,1,sizeof(biaoji)); biaoji[1]=0; for(int i=2;i<40010;i++) if(biaoji[i]) for(int j=i*i;j<40010;j+=i) biaoji[j]=0; } void get(){ int c=40000; int x=1,y=200,a=1,b=200; while(c>0){ for(int i=x;i<=y;i++){ map[x][i]=c--; } x++; for(int i=x;i<=y;i++){ map[i][y]=c--; } y--; for(int i=y;i>=a;i--){ map[b][i]=c--; } b--; for(int i=b;i>a;i--){ map[i][a]=c--; } a++; } } struct node{ int x,y,st; }; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; int X,Y; int dfs(int si,int sj,int c){ memset(vis,0,sizeof(vis)); queue<node>q; node now,tmp; now.x=si,now.y=sj,now.st=c; vis[si][sj]=1; if(map[now.x][now.y]==Y){ return now.st; } q.push(now); while(!q.empty()){ tmp=q.front(); q.pop(); for(int i=0;i<4;i++){ now.x=tmp.x+dx[i]; now.y=tmp.y+dy[i]; now.st=tmp.st+1; if(now.x<1||now.x>200||now.y<1||now.y>200||biaoji[map[now.x][now.y]]||vis[now.x][now.y]) continue; if(map[now.x][now.y]==Y){ return now.st; } vis[now.x][now.y]=1; q.push(now); } } return -1; } int main(){ getprime(); get(); int si,sj; int Case=0; while(~scanf("%d%d",&X,&Y)){ int flag=1; for(int i=1;i<=200&&flag;i++){ for(int j=1;j<=200&&flag;j++){ if(map[i][j]==X){ si=i; sj=j; flag=0; } } } int ans=dfs(si,sj,0); if(ans!=-1){ printf("Case %d: %d ",++Case,ans); } else{ printf("Case %d: impossible ",++Case); } } }