1. Question link:
Http://acm.hdu.edu.cn/showproblem.php? Pid = 1, 4255
2. Reference code:
# Include <stdio. h >#include <cmath> # include <queue> # include <cstring> using namespace std; # define Max 40000int prime [Max]; int map [200] [200]; int sx, sy, ex, ey; int used [200] [200]; int dir [4] [2] = }, {-1, 0}, {0,-1 }}; struct node {int x, y; int step; friend bool operator <(node n1, node n2) {return n1.step> n2.step; }}; void get_prime () {int m = (int) sqrt (Max + 0.5), c = 0, I, j; memset (prime, 0, sizeof (prime); for (I = 2; I <= m; I ++) {if (! Prime [I]) {for (j = I * I; j <= Max; j + = I) prime [j] = 1 ;}} for (I = 2; I <= Max; I ++) prime [I] =! Prime [I];} void get_map () {int n = 120, I = 0, j = 0, t = n * n; memset (map, 0, sizeof (map); map [0] [0] = t; while (t> 1) {while (j + 1 <n &&! Map [I] [j + 1]) // right map [I] [++ j] = -- t; while (I + 1 <n &&! Map [I + 1] [j]) // map [++ I] [j] = -- t; while (J-1> = 0 &&! Map [I] [J-1]) // left map [I] [-- j] = -- t; while (I-1> = 0 &&! Map [I-1] [j]) // on map [-- I] [j] = -- t; // Order of 3 and 4} int bfs () {priority_queue <node> q; memset (used, 0, sizeof (used); node cur, next; cur. x = sx; cur. y = sy; cur. step = 0; int I; used [cur. x] [cur. y] = 1; q. push (cur); while (! Q. empty () {cur = q. top (); q. pop (); if (cur. x = ex & cur. y = ey) return cur. step; for (I = 0; I <4; I ++) {next. x = cur. x + dir [I] [0]; next. y = cur. y + dir [I] [1]; if (next. x> = 0 & next. x <200 & next. y> = 0 & next. y <200 &&! Used [next. x] [next. y] &! Prime [map [next. x] [next. y]) {next. step = cur. step + 1; q. push (next); used [next. x] [next. y] = 1 ;}}} return-1 ;}int main () {int I, j, x, y, count = 0, ans; get_prime (); get_map (); while (~ Scanf ("% d", & x, & y) {printf ("Case % d:", ++ count); for (I = 0; I <200; I ++) {for (j = 0; j <200; j ++) {if (map [I] [j] = x) {sx = I; sy = j;} else if (map [I] [j] = y) {ex = I; ey = j ;}}} if (prime [map [sx] [sy] | prime [map [ex] [ey]) {printf ("% d \ n", ans ); continue;} ans = bfs (); if (ans =-1) printf ("impossible \ n"); elseprintf ("% d \ n", ans );} return 0 ;}