首页 > 其他 > 详细

洛谷P1141 01迷宫

时间:2019-10-11 00:50:43      阅读:102      评论:0      收藏:0      [点我收藏+]

https://www.luogu.org/problem/P1141

#include<bits/stdc++.h>//最喜欢的万能头
using namespace std;
int n,m;
char a[1005][1005];//注意一定要开char,否则会炸,后果自负
int b[1005][1005];//记录有没有走过
int i,j,ans[100005];//记录答案
int x,y;//提供的下标
int mx[4]={0,0,1,-1};//四个方向寻找
int my[4]={1,-1,0,0};
void dfs(int x,int y,int p,int i){
    if(x<0||x>=n||y<0||y>=n||b[x][y]!=-1||a[x][y]-48!=p)//如果不在范围内,或是找过或是数字不正确
    return;
    b[x][y]=i;//这一步很关键,下面叙述
    ans[i]++;//加一个点
    for(int k=0;k<4;k++){
        int kx=x+mx[k];
        int ky=y+my[k];
        dfs(kx,ky,!p,i);//dfs常用套路,    !p是为了变换数字
    }
}
int main(){
    cin>>n>>m;
    for(i=0;i<n;i++)
    scanf("%s",&a[i]);
    memset(b,-1,sizeof(b));//清空
    for(i=0;i<m;i++){
        cin>>x>>y;//输入
        x--,y--;//因为数组从0开始读,给的下标从1开始
        if(b[x][y]==-1)
        dfs(x,y,a[x][y]-48,i);//符合条件就dfs
        else
        ans[i]=ans[b[x][y]];//最关键的一步!!如果已经走过,意味着本轮搜索结束,答案就是上一步的i,也就是b数组存在的第二意义。(承接上文b[x][y]=i;)
    }
    for(i=0;i<m;i++)
    cout<<ans[i]<<endl;//完美输出
    return 0;
}
/*因为ASC码48就是‘0‘,也就是说‘0‘的值是48,而后依次是‘1‘到‘9‘  如果不减去,会超出n,
这样正好是char型减去48就是它对应的int值 */

 

洛谷P1141 01迷宫

原文:https://www.cnblogs.com/QingyuYYYYY/p/11651427.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!