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;
}