TYVJ 1143 飘飘乎居士的约会 解题报告
f[0][i][j]代表不走房子到达i, j的最短路径是多少,f[1][i][j]代表走房子到达i, j的最短路径是多少(并不一定是从i, j走房子)?
然后看我的代码吧,实在不好说……
#include <stdio.h> #include <string.h> #include <stdlib.h> #define Q_MAX 100000 #define deal(a, b) deal_((a), (b), x, y) int f[2][1000][1000]; char map[1000][1000]; struct dot{ int x, y; }queue[Q_MAX]; int head, rear; int used[1000][1000]; int n, m; void enqueue(int x, int y) { if(used[x][y]){ return; } used[x][y] = 1; queue[rear].x = x; queue[rear].y = y; rear = (rear + 1) % Q_MAX; } void exqueue(int *x, int *y) { *x = queue[head].x; *y = queue[head].y; used[*x][*y] = 0; head = (head + 1) % Q_MAX; } void deal_(int a, int b, int x, int y) { if(a < 0 || a >= n || b < 0 || b >= m){ return ; } if(map[a][b] == '.'){ if(f[0][a][b] > f[0][x][y] + 1){ f[0][a][b] = f[0][x][y] + 1; enqueue(a, b); } if(f[1][a][b] > f[1][x][y] + 1){ f[1][a][b] = f[1][x][y] + 1; enqueue(a, b); } }else if(map[a][b] == '*'){ if(f[1][a][b] > f[0][x][y] + 1){ f[1][a][b] = f[0][x][y] + 1; enqueue(a, b); } } } int main(int argc, char **argv) { int i, j; int x, y; int min; scanf("%d%d\n", &n, &m); for(i = 0; i < n; i++){ for(j = 0; j < m; j++){ scanf("%c", &map[i][j]); } scanf("\n"); } memset(f, 0x7F, sizeof(f)); f[0][0][0] = 0; enqueue(0, 0); while(head != rear){ exqueue(&x, &y); deal(x - 1, y); deal(x + 1, y); deal(x, y - 1); deal(x, y + 1); } if(f[0][n - 1][m - 1] > f[1][n - 1][m - 1]){ min = f[1][n - 1][m - 1]; }else{ min = f[0][n - 1][m - 1]; } if(min == 0x7F7F7F7F){ printf("no\n"); }else{ printf("%d\n", min); } return 0; }