洛谷 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月份才入信息组,发的题解讨论等级不高,新人可看。

转载于:https://www.cnblogs.com/812-xiao-wen/p/9879282.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值