HDU 4255 A Famous Grid
A Famous Grid
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 798 Accepted Submission(s): 318
Problem Description
Mr. B has recently discovered the grid named "spiral grid".
Construct the grid like the following figure. (The grid is actually infinite. The figure is only a small part of it.)
![](http://acm.hdu.edu.cn/data/images/C410-1011-1.jpg)
Considering traveling in it, you are free to any cell containing a composite number or 1, but traveling to any cell containing a prime number is disallowed. You can travel up, down, left or right, but not diagonally. Write a program to find the length of the shortest path between pairs of nonprime numbers, or report it's impossible.
![](http://acm.hdu.edu.cn/data/images/C410-1011-2.jpg)
Construct the grid like the following figure. (The grid is actually infinite. The figure is only a small part of it.)
![](http://acm.hdu.edu.cn/data/images/C410-1011-1.jpg)
Considering traveling in it, you are free to any cell containing a composite number or 1, but traveling to any cell containing a prime number is disallowed. You can travel up, down, left or right, but not diagonally. Write a program to find the length of the shortest path between pairs of nonprime numbers, or report it's impossible.
![](http://acm.hdu.edu.cn/data/images/C410-1011-2.jpg)
Input
Each test case is described by a line of input containing two nonprime integer 1 <=x, y<=10,000.
Output
For each test case, display its case number followed by the length of the shortest path or "impossible" (without quotes) in one line.
Sample Input
1 4
9 32
10 12
Sample Output
Case 1: 1
Case 2: 7
Case 3: impossible
Source
题目大意:有螺旋数组成的图,素数不能过,求两个数之间怎么过最短。
这个x,y《=10000,模拟图的时候最好按40000建图
1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 6 using namespace std; 7 8 int X,Y; 9 int map[210][210],vis[210][210]; 10 int prime[40010]; 11 12 void getPrime(){ 13 memset(prime,1,sizeof(prime)); 14 prime[1]=0; 15 for(int i=2;i<40010;i++) 16 if(prime[i]) 17 for(int j=i*i;j<40010;j+=i) 18 prime[j]=0; 19 } 20 21 void Graph(){ 22 int c=40000; 23 int i,x=1,y=200,a=1,b=200; 24 while(c>0){ 25 for(i=x;i<=y;i++) 26 map[x][i]=c--; 27 x++; 28 for(i=x;i<=y;i++) 29 map[i][y]=c--; 30 y--; 31 for(i=y;i>=a;i--) 32 map[b][i]=c--; 33 b--; 34 for(i=b;i>a;i--) 35 map[i][a]=c--; 36 a++; 37 } 38 } 39 40 struct node{ 41 int x,y; 42 int step; 43 }; 44 45 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 46 47 int BFS(int si,int sj,int c){ 48 queue<node> q; 49 while(!q.empty()) 50 q.pop(); 51 node info,tmp; 52 memset(vis,0,sizeof(vis)); 53 info.x=si,info.y=sj,info.step=c; 54 vis[si][sj]=1; 55 if(map[info.x][info.y]==Y) 56 return info.step; 57 q.push(info); 58 while(!q.empty()){ 59 tmp=q.front(); 60 q.pop(); 61 for(int i=0;i<4;i++){ 62 info.x=tmp.x+dir[i][0]; 63 info.y=tmp.y+dir[i][1]; 64 info.step=tmp.step+1; 65 if(info.x<1 || info.x>200 || info.y<1 || info.y>200 || prime[map[info.x][info.y]]) 66 continue; 67 if(map[info.x][info.y]==Y) 68 return info.step; 69 if(!vis[info.x][info.y]){ 70 vis[info.x][info.y]=1; 71 q.push(info); 72 } 73 } 74 } 75 return -1; 76 } 77 78 int main(){ 79 80 //freopen("input.txt","r",stdin); 81 82 int cases=0; 83 getPrime(); 84 Graph(); 85 int si,sj; 86 while(~scanf("%d%d",&X,&Y)){ 87 int flag=1; 88 for(int i=1;i<=200 && flag;i++) 89 for(int j=1;j<=200 && flag;j++){ 90 if(map[i][j]==X){ 91 si=i; 92 sj=j; 93 flag=0; 94 } 95 } 96 int ans=BFS(si,sj,0); 97 if(ans==-1) 98 printf("Case %d: impossible\n",++cases); 99 else 100 printf("Case %d: %d\n",++cases,ans); 101 } 102 return 0; 103 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步