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;
}
程序在VC++ 6下顺利编译通过。 一、 实验目的: (1) 熟练掌握链栈的基本操作及应用。 (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序。 二、实验内容: 【问题描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】 首先实现一个链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示到下一坐标的方向。如:对于下列据的迷宫输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),……。 【测试据】 迷宫的测试据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 以方阵形式输出迷宫及其通路。 输出: 请输入迷宫的长和宽:5 5 请输入迷宫内容: 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 迷宫的路径为 括号内的内容分别表示为(行坐标,列坐标,字化方向,方向) (1,1,1,↓) (2,1,2,→) (2,2,1,↓) (3,2,1,↓) (4,2,2,→) (4,3,1,↓) (5,3,2,→) (5,4,2,→) (5,5,0,) 迷宫路径探索成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值