计蒜客-走迷宫

给一个 n行 m 列的 2 维的迷宫,'S'表示迷宫额起点,'T'表示迷宫的终点,'#'表示不能通过的点,'.' 表示可以通过的点。你需要从'S'出发走到'T',每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。

输入格式
第一行输入 n, m (1≤n,m≤10) 表示迷宫大小。

接下来输入 n行字符串表示迷宫。

输出格式
输入通过迷宫的方法数。

样例输入1
2 3
S.#
..T
样例输出1
2
样例输入2
3 3
S..
.#.
..T
样例输出2
2
 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10;
char a[N+5][N+5];
int flag[N+5][N+5];
int cnt=0;
int n,m;
void dfs(int x,int y)
{
	if(x<0||y<0||x>=n||y>=m)
	{
		return;
	}
	if(a[x][y]=='#')
	{
		return;
	}
	if(a[x][y]=='T')
	{
		cnt++;
		return;
	}
	if(!flag[x+1][y])//向右走 
	{
		flag[x+1][y]=1;
		dfs(x+1,y);
		flag[x+1][y]=0;
	}
	if(!flag[x][y+1])//向上走 
	{
		flag[x][y+1]=1;
		dfs(x,y+1);
		flag[x][y+1]=0;
	}
	if(!flag[x-1][y])//向左走 
	{
		flag[x-1][y]=1;
		dfs(x-1,y);
		flag[x-1][y]=0;
	}
	if(!flag[x][y-1])//向下走 
	{
		flag[x][y-1]=1;
		dfs(x,y-1);
		flag[x][y-1]=0;
	}
	return;
}
int main()
{
	memset(flag,0,sizeof(flag));
	int sx,sy,ex,ey;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='S')
			{
				sx=i;
				sy=j;
			}
		}
	}
	flag[sx][sy]=1;
	dfs(sx,sy);
	cout<<cnt<<endl;
	return 0;
 } 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,走迷宫游戏是一个非常有意思的课程设计,需要用到许多数据结构和算法。以下是一个简单的实现思路: 1. 将迷宫地图存储在一个二维数组中,其中 0 表示可以通过的路,1 表示墙壁。 2. 使用栈来实现迷宫的深度优先搜索,从起开始,不断往前,直到遇到墙壁或者到达终。 3. 如果遇到墙壁,则将当前位置出栈,并回溯到上一个位置,继续搜索。 4. 如果到达终,则输出路径并结束程序。 下面是一个简单的实现代码: ```python class Maze: def __init__(self, maze_map): self.maze_map = maze_map self.width = len(maze_map[0]) self.height = len(maze_map) def get_neighbors(self, pos): x, y = pos neighbors = [] if x > 0 and self.maze_map[y][x-1] == 0: neighbors.append((x-1, y)) if y > 0 and self.maze_map[y-1][x] == 0: neighbors.append((x, y-1)) if x < self.width-1 and self.maze_map[y][x+1] == 0: neighbors.append((x+1, y)) if y < self.height-1 and self.maze_map[y+1][x] == 0: neighbors.append((x, y+1)) return neighbors def find_path(self, start, end): stack = [start] visited = set() while stack: pos = stack[-1] if pos == end: return stack if pos not in visited: visited.add(pos) neighbors = self.get_neighbors(pos) for neighbor in neighbors: if neighbor not in visited: stack.append(neighbor) else: stack.pop() return None maze_map = [ [0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [1, 1, 1, 1, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 1, 1, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], ] maze = Maze(maze_map) start = (0, 0) end = (7, 6) path = maze.find_path(start, end) if path: print(path) else: print("No path found") ``` 这里我们使用了一个 Maze 类来存储迷宫地图和实现搜索算法。其中 get_neighbors 方法用来获取一个位置的所有邻居节,find_path 方法用来实现深度优先搜索。我们首先将起压入栈中,然后不断从栈中取出最后一个进行搜索,如果当前节是终,则返回路径;否则将当前节的所有邻居节压入栈中。如果当前节没有邻居节或者所有邻居节都已经被访问过,则将当前节出栈,回溯到上一个。 这个实现还比较简单,如果需要实现更高效的算法,可以考虑使用广度优先搜索或者A*算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值