NYOJ592 spiral grid 【BFS】

来源:互联网 发布:聚创淘宝培训 编辑:程序博客网 时间:2024/04/29 03:55

spiral grid

时间限制:2000 ms  |  内存限制:65535 KB
难度:4
描述
Xiaod 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.)


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. In addition, traveling from a prime number is disallowed, either. 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.
输入
Each test case is described by a line of input containing two nonprime integer 1 <=x, y<=10,000.
输出
For each test case, display its case number followed by the length of the shortest path or "impossible" (without quotes) in one line.
样例输入
1 49 3210 12
样例输出
Case 1: 1Case 2: 7Case 3: impossible

构图的时候要格外细心。

#include <stdio.h>#include <math.h>#include <string.h>#include <queue>#define abs(a) (a) > 0 ? (a) : -(a)using std::queue;int map[102][102], vis[102][102], prime[10002] = {1, 1};int x, y, mov[][2] = {0, 1, 0, -1, 1, 0, -1, 0};struct Node{int x, y, steps;};queue<Node> Q;void preprocess(){//画图的时候要细心int count = 10000, x = 2, y = 2;for(int i = 1; i <= 100; ++i)map[1][i] = count--;for(int i = 2; i <= 100; ++i)map[i][100] = count--;for(int i = 99; i > 0; --i)map[100][i] = count--;for(int i = 99; i > 1; --i)map[i][1] = count--;map[2][2] = count--;while(count > 0){while(!map[x][y+1]) map[x][++y] = count--;while(!map[x+1][y]) map[++x][y] = count--;while(!map[x][y-1]) map[x][--y] = count--;while(!map[x-1][y]) map[--x][y] = count--;}}Node getX(){Node t = {0};for(int i = 1; i < 101; ++i)for(int j = 1; j < 101; ++j){if(map[i][j] == x){t.x = i; t.y = j;return t;}}}void getPrime(){for(int i = 2; i <= 100; ++i){if(prime[i]) continue;for(int j = i * i; j <= 10000; j += i)prime[j] = 1;}}int check(Node t){if(t.x < 1 || t.y < 1 || t.x > 100 || t.y > 100)return 0;if(vis[t.x][t.y] || !prime[map[t.x][t.y]])return 0;return 1;}void BFS(){Node temp, now;while(!Q.empty()) Q.pop();now = getX();if(x == y){printf("0\n"); return;}Q.push(now);while(!Q.empty()){now = Q.front();Q.pop();for(int i = 0; i < 4; ++i){temp = now;temp.x += mov[i][0];temp.y += mov[i][1];++temp.steps;if(check(temp)){if(map[temp.x][temp.y] == y){printf("%d\n", temp.steps);return;}vis[temp.x][temp.y] = 1;Q.push(temp);}}}printf("impossible\n");}int main(){getPrime();preprocess();int times = 1;while(scanf("%d%d", &x, &y) == 2){printf("Case %d: ", times++);memset(vis, 0, sizeof(vis));BFS();}return 0;}


0 0