TYVJ 1143 飘飘乎居士的约会 解题报告

本文深入探讨了一种迷宫寻径算法,通过定义状态转移矩阵f[][][],实现对迷宫路径的高效求解。文章详细介绍了算法的实现过程,包括状态转移方程、边界条件设置以及使用队列进行广度优先搜索的策略。该算法能够处理包含障碍物的复杂迷宫环境,适用于游戏开发、机器人导航等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  

转载于:https://www.cnblogs.com/yylogo/archive/2011/08/14/TYVJ-1143.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值