• 洛谷 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)的:博主很笨,请不要欺负他』✿✍

  • 相关阅读:
    网络基础、多线程、ftp任务铺垫
    文件上传下载、socketserver(并发)、解读socketserver源码
    模拟ssh、黏包、hashlib模块(MD5)
    面向对象多继承(C3算法)/网络编程
    Slideout吐槽
    HDU 1756 Cupid's Arrow 判断点在多边形的内部
    POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,判断点在凸多边形内
    位运算 找出给定的数中其他数都是两个,有两个是一个的数
    NYOJ 1107 最高的奖励(贪心+优先队列)
    POJ 2653 Pick-up sticks (判断线段相交)
  • 原文地址:https://www.cnblogs.com/812-xiao-wen/p/9879282.html
Copyright © 2020-2023  润新知