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

  

posted @ 2011-08-14 22:52  zqynux  阅读(275)  评论(0编辑  收藏  举报