01迷宫的总结

馋奶兔 提交于 2019-12-30 03:04:07

首先,大家先看一下题吧:01迷宫
大体的思路:广搜。
细节:首先,我要把每次广搜的结果储存起来,然后每一次不一样的广搜(是之前从来没有遍历过的)全部储存为这一次遍历的编号。如果询问的点是以前广搜过的,那么就输出那一次广搜的结果。如果没有遍历过,那么就进行一次广搜。
代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <string>
#include <math.h>
#include <cmath>
#include <time.h>
#include <cmath>
#include <stack>
#include <queue>
//#include<windows.h>
//#include <bits/stdc++.h>
using namespace std;
/*
输入:

输出:


*/
int cnt;//每一次广搜的计数器 
int n,m;//n行,n列,m个询问
char a[1001][1001];//初始地图 
int sx,sy;//起始坐标(因为每一次都不一样) 
int k=1;//当前遍历的编号 
int g[1000010];
struct node {//队列 
	int x,y;//坐标 
} edge[1000010];
int head=1,tail=1;//队头,队尾 
int nxt[5][2]= {{-1,0},{1,0},{0,-1},{0,1}};//方向 
int book[1001][1001];
void bfs() {
	edge[tail].x=sx;//初始化 
	edge[tail].y=sy;
	book[sx][sy]=k;
	cnt=1;
	tail++;//队尾+1 
	while(head<tail) {//如果队里不为空 
		for(int i=0; i<4; i++) {//遍历每一个方向 
			int nx=edge[head].x+nxt[i][0];//临时的方向 
			int ny=edge[head].y+nxt[i][1];
//			cout << a[edge[head].x][edge[head].y] << " " << a[nx][ny] << " " << nx << " "<< ny << endl;
			if(nx>0&&ny>0&&nx<=n&&ny<=n&&book[nx][ny]==0&&//如果没有超出边界 
			        ((a[edge[head].x][edge[head].y]=='1'&&a[nx][ny]=='0')//如果是从1走向0
			         ||(a[edge[head].x][edge[head].y]=='0'&&a[nx][ny]=='1'))) {//如果是从0走向1 
//				cout << book[nx][ny] <<" ";
//				cout << book[1][1] << " ";
				book[nx][ny]=k;//赋值为本次遍历编号 
//				cout << nx <<" " << ny << "!!!" <<endl;
				edge[tail].x=nx;//
				edge[tail].y=ny;
				cnt++;//计数器+1 
//				cout << edge[tail].cnt << endl;
//				cout << tail << endl;
				tail++;//为下一个元素进行准备 
			}
		}
		head++;//弹出队头元素 
	}
}
int main() {
//freopen("**.in","r",stdin);
//freopen("**.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {//初始地图 
		for(int j=1; j<=n; j++) {
			cin >> a[i][j];
		}
	}
	while(m--) {//遍历m次 
		cin >> sx >> sy;//初始坐标 
		cnt=1;//初始化 
		tail=1;
		head=1;
//		for(int i=0;i<=n;i++){
//			for(int j=0;j<=n;j++){
//				book[i][j]=0;
//			}
//		}
		if(book[sx][sy]!=0) {//如果已经广搜过 
			cout << g[book[sx][sy]] << endl;//直接输出 
		} else {
			bfs();//负责进行广搜 
			g[k]=cnt;//把这次广搜的结果储存起来 
			k++;//编号加一 
			cout << cnt << endl;
		}
	}

//fclose(stdin);
//fclose(stdout);
	return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!