小明的迷宫

2024-06-15 03:58
文章标签 迷宫 小明

本文主要是介绍小明的迷宫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Accept: 65    Submit: 196
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

小明误入迷宫,塞翁失马焉知非福,原来在迷宫中还藏着一些财宝,小明想获得所有的财宝并离开迷宫。因为小明还是学生,还有家庭作业要做,所以他想尽快获得所有财宝并离开迷宫。

 Input

有多组测试数据。

每组数据第一行给出两个正整数n,m(0<n,m<=100)。代表迷宫的长和宽。

接着n行,每行m个整数。正数代表财宝(财宝的个数不超过10);负数代表墙,无法通过;0代表通道。

每次移动到相邻的格子,所花费的时间是1秒。小明只能按上、下、左、右四个方向移动。

小明的初始位置是(1,1)。迷宫的出口也在(1,1)。

 Output

输出获得所有财宝并逃出迷宫所花费的最小时间,如果无法完成目标则输出-1。

 Sample Input

3 30 0 00 100 00 0 02 21 11 1

 Sample Output

44

 Source


状态压缩dp
bfs求各点之间的最短路,最后是旅行商问题。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdio>
#include <queue>
#include <cstring>using namespace std;const int INF = 10000000;
const int MAXN = 100 + 2;
int mt[MAXN][MAXN];
int pos[MAXN][MAXN];
int n, m, num;
int arr[10 + 1];
int dis[10 + 1][10 + 1];
int dp[2048 + 10][11 + 1];struct Node
{int x, y;int pos;int dis;bool operator < (const Node a) const{return pos < a.pos;}
}money[10 + 1];bool vis[MAXN][MAXN];
int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
queue <Node> q;void bfs(int x)
{Node cur, next;memset(vis, false, sizeof(vis));cur = money[x];cur.dis = 0;vis[cur.x][cur.y] = true;q.push(cur);while (!q.empty()){cur = q.front();q.pop();if (mt[cur.x][cur.y] > 0) dis[x][pos[cur.x][cur.y]] = dis[pos[cur.x][cur.y]][x] = cur.dis;for (int 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 < n && next.y >= 0 && next.y < m){if (mt[next.x][next.y] != -1 && vis[next.x][next.y] == false){vis[next.x][next.y] = true;next.dis = cur.dis + 1;q.push(next);}}}}
}void input()
{while (scanf("%d %d", &n, &m) != EOF){num = 0;money[0].x = 0;money[0].y = 0;money[0].pos = 0;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){scanf("%d", &mt[i][j]);pos[i][j] = 0;if (mt[i][j] > 0){num++;money[num].x = i;money[num].y = j;money[num].pos = num;pos[i][j] = num;}}}if (mt[0][0] == -1){printf("-1\n");continue;}for (int i = 0; i <= num; i++){for (int j = 0; j <= num; j++){dis[i][j] = (i == j ? 0 : INF);}}for (int i = 1; i <= num; i++) arr[i] = i;for (int i = 0; i <= num; i++) bfs(i);long long ans = INF, temp = 0;for (int i = 0; i < 2048 + 10; i++){for (int j = 0; j < 11 + 1; j++) dp[i][j] = INF;}dp[0][0] = 0;for (int i = 0; i < 1 << (num + 1); i++){for (int j = 0; j < num + 1; j++){for (int k = 0; k < num + 1; k++){if ((i & (1 << j)) == 0){if (dis[j][k] != INF){dp[i | (1 << j)][j] = min(dp[i | (1 << j)][j], dp[i][k] + dis[j][k]);}}}}}if (dp[(1 << (num + 1)) - 1][0] != INF){printf("%d\n", dp[(1 << (num + 1)) - 1][0]);}else{printf("%d\n", -1);}}
}int main()
{input();return 0;
}



这篇关于小明的迷宫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062362

相关文章

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

nyoj306(走迷宫)

走迷宫 时间限制: 1000 ms  |  内存限制: 65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。 这个迷宫可以向上走,向

《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

 示例:基于抽象工厂的迷宫   实现:     如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类

走迷宫变体【拼多多1面0905】

题目大致描述: 有一个N*M的迷宫,主角被放在随机的位置上,给你一个函数,控制主角逃离迷宫。 可以使用的函数:int move(String direction) (//direction代表上下左右四个方向,分别是“U"、“D"、“L"、“R"//返回值有3种,包括-1、0、1;-1表示前面是陷阱或墙,主角不能往前走,会留在原地;0表示迷宫出口,恭喜成功逃离;1表示前面可以走,主角前进一格)

【HDU】4521 小明系列问题——小明序列 线段树+DP

小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1632    Accepted Submission(s): 485 Problem Description   大家都知道小明最喜欢研究

FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)

解题报告 http://blog.csdn.net/juncoder/article/details/38146041 题目传送门 题意 求最短路和最短路的路数。 思路: BFS+DFS,先求出最短路。在DFS搜等于最短路的条数。 不加优化SDUTOJ过了,数据就是水。 确定了最短路的长度,加上奇偶剪枝FOJ也过了。 #include <queue>#include <c

A*算法解决迷宫寻路问题

A*算法解决迷宫寻路问题 问题描述 下图是一个迷宫,试为机器人找一条从Start到End的最短路径设计一搜索算法 设计思路 a)状态空间的表示 首先将迷宫图转换为列表形式呈现,每个格子用 (横坐标,纵坐标,上通路状态,下通路状态,左通路状态,右通路状态)来表示,通路状态用1或0表示,可通过为1,不可通过为0。比如起点(1,1),假定不能从起点出去,所以(1,1)可以走下或走右,所以第一格

两种迷宫生成算法

这里要介绍两种迷宫生成的算法,Recursive Backtracking和Eller’s Algorithm。它们都生成的是Perfect maze,也就是说每个区域都连通,并且没有环的迷宫。 我们现在说Recursive backtracking: 迷宫的初始状态是墙壁都存在。选择一个开始区域。 随机得选择一个没有访问过的邻接区域,并打通与它之间的墙壁。此邻接区域称为当前区域。

深度优先遍历之迷宫生成算法

1、图的深度优先遍历简介     例如,要遍历上面这个图  采取深度优先算法(从1开始)  准备一个Stack s,预定义三种状态:A未被访问 B正准备访问 C已经访问  一、访问1,把它标记为已经访问,然后将于它相邻的并且标记为未被访问的点压入s 中并标记为正准备访问  此时系统状态:  已经被访问的点:1  还没有被访问的点:3 4