7-7 走迷宫

你正在玩一个迷宫游戏,迷宫有n×n格,每一格有一个数字0或1,可以从某一格移动到相邻四格中的一格上。为了消磨时间,你改变了玩法,只许从0走到1或者从1走到0。

现在给你一个起点,请你计算从这个格子出发最多能移动多少个格子(包含自身)。
输入格式:

第1行包含两个正整数n和m(1≤n≤1000,1≤m≤10000)。

接下来n行,对应迷宫中的n行,每行n个字符,字符为0或者1,字符之间没有空格。

接下来m行,表示m次询问。每行2个正整数i,j,表示从迷宫中第i行第j列的格子开始走。
输出格式:

输出共m行,每行一个整数,分别对应于输入数据中的m次询问,给出最多能移动的格子数。
输入样例:

2 2
01
10
1 1
2 2

输出样例:

4
4

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
}Node;
int n,m;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int G[1002][1002];
bool vis[1002][1002]={false};
int step[1002][1002]={0};
bool test(node a,node b){
	if(b.x>=1&&b.x<=n&&b.y>=1&&b.y<=n&&!vis[b.x][b.y]&&G[a.x][a.y]!=G[b.x][b.y])	return true;
	return false;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			char c;cin>>c;
			G[i][j]=c-'0';
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			stack<node>s;//经过的每一个点 
			queue<node>q;//bfs 
			int cnt=1;
			Node.x=i;Node.y=j;
			if(vis[i][j]==false){
				vis[i][j]=true;
				q.push(Node);
				while(!q.empty()){
					node now=q.front();
					q.pop();
					for(int k=0;k<4;k++){//四个方向 
						node next;
						next.x=now.x+d[k][0];
						next.y=now.y+d[k][1];
						if(test(now,next)){
							q.push(next);
							vis[next.x][next.y]=true;
							cnt++;
							s.push(next);
						}
					}
				}
				step[i][j]=cnt;
				while(!s.empty()){//堆栈用来存经过的每一个点,他们的步数都相同 
					node a=s.top();
					step[a.x][a.y]=cnt;
					s.pop();
				}
			}
		}
	}
	while(m--){
		int a,b;cin>>a>>b;
		cout<<step[a][b]<<endl;
	}
	return 0;
}
  • 2
    点赞
  • 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、付费专栏及课程。

余额充值