洛谷 P1141 01迷宫

指针大法好!!

看见前面大佬都用广搜,我推荐一款指针加深搜:

这一题我们可以定义一个指针数组,把能相互到达的格子的指针指向同一个地址,这样就能同时改变多个格子的到达数。

主要步骤:

int m,n,tot[100000],c[100000],d[100000];//c,d数组为 m 的横纵坐标 
char ch;int *a[1001][1001];int b[1002][1002];//定义指针 
for(;m>=1;m--){
		cin>>c[m]>>d[m];
		if(a[c[m]][d[m]]){//若指针指向的地址有数,即走过了便直接输出。 
			cout<<*a[c[m]][d[m]]<<endl;//就是记忆搜索 
			continue;
		}
		f(c[m],d[m]);//搜索 
		cout<<tot[m]<<endl;
		tot=0;//记得归0 
	}

深搜函数:

void f(int i,int j){//深搜 
	a[i][j]=&tot[m];//让这个格子的指针,指向累加数; 
	tot[m]++;//累加答案; 
	for(int o=0;o<=3;o++)
		if(i+x[o]>0&&i+x[o]<=n&&j+y[o]>0&&j+y[o]<=n&&!a[i+x[o]][j+y[o]])//走过的不走,不能越界 
		    if(b[i+x[o]][j+y[o]]!=b[i][j])//题目要求 
		        f(i+x[o],j+y[o]);//继续搜索

完整代码:

#include<bits/stdc++.h>
using namespace std;
int m,n,tot[100000],c[100000],d[100000];//c,d数组为 m 的横纵坐标 
char ch;int *a[1001][1001];int b[1002][1002];//定义指针 
int x[4]={1,0,-1,0};//四个方位 ; 
int y[4]={0,1,0,-1};//方便对比; 
void f(int i,int j){//深搜 
	a[i][j]=&tot[m];//让这个格子的指针,指向累加数; 
	tot[m]++;//累加答案; 
	for(int o=0;o<=3;o++)
		if(i+x[o]>0&&i+x[o]<=n&&j+y[o]>0&&j+y[o]<=n&&!a[i+x[o]][j+y[o]])//走过的不走,不能越界 
		    if(b[i+x[o]][j+y[o]]!=b[i][j])//题目要求 
		        f(i+x[o],j+y[o]);//继续搜索
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)//输入 
			scanf("%1d",&b[i][j]);
	for(;m>=1;m--){
		cin>>c[m]>>d[m];
		if(a[c[m]][d[m]]){//若指针指向的地址有数,即走过了便直接输出。 
			cout<<*a[c[m]][d[m]]<<endl;//就是记忆搜索 
			continue;
		}
		f(c[m],d[m]);//搜索 
		cout<<tot[m]<<endl;//(输出,圆满)
	}
    return 0;
}

这是我的博客空间,发的题解和一些洛谷技巧都在里面。

另外,本人真的只是一个弱弱的萌新,7月份才入信息组,发的题解讨论等级不高,新人可看。

✐☎博主撰文不易,转载还请注明出处;若对本文有疑,请私信或在下方讨论中提出。O(∩_∩)O谢谢!☏

☃〔尽管小伙伴们肯定有千百种方式针对,但博主还是极其非常十分不要脸的把反对键吃掉辣!〕☃

✿『$At$ $last$:非常一(hu)本(shuo)正(ba)经(dao)的:博主很笨,请不要欺负他』✿✍

原文地址:https://www.cnblogs.com/812-xiao-wen/p/9879282.html