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 4 9 32 10 12
- 样例输出
-
Case 1: 1 Case 2: 7 Case 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; }
NYOJ592 spiral grid 【BFS】
时间: 2024-10-26 08:45:50