哈尔滨理工大学软件与微电子学院程序设计竞赛H-Maze

Maze

https://ac.nowcoder.com/acm/contest/5929/H

题解:
一看到3000的范围,如果每次都进行暴力深搜的话,会不会超时?(应该会)
我们可以发现假设我们能从点(x1,y1)走到点(x2,y2)那么我们必然可以从(x2,y2)走到点(x1,y1)
那么假设我们走过这一片区域的面积是5,那么这五点,你从哪个点进入这个地图,最多能走出的面积也只能是5.
那就好办了,记忆化搜索。
我们把每个区域都标记为一种颜色,如果遇到我们之前标记的这个颜色,我们就可以直接输出之前这个颜色对应的面积了。
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 3010;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9+7;
using namespace std;
int n,m,q;
char a[maxn][maxn];
int color[maxn][maxn];
bool visited[maxn][maxn];
int cnt[9000000];
int sum,ans=1;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
inline bool judge(int x,int y,int x1,int y1){
    if(a[x][y]=='+'&&a[x1][y1]=='-'&&visited[x1][y1]==false) return true;
    if(a[x][y]=='-'&&a[x1][y1]=='+'&&visited[x1][y1]==false) return true;
    return false;
}
void dfs(int x,int y,int k){
    color[x][y]=k;
    sum++;
    for(int i=0;i<4;i++){
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(judge(x,y,nx,ny)){
            visited[nx][ny]=true;
            dfs(nx,ny,k);
        }
    }
}

int main()
{
    cin>>n>>m>>q;
    memset(a,-1,sizeof(a));
    memset(visited,false,sizeof(visited));
    for(int i=1;i<=n;i++){
        scanf("%s",a[i]+1);
    }
    while(q--){
        int x,y;
        scanf("%d%d",&x,&y);
        if(color[x][y]){
            printf("%d\n",cnt[color[x][y]]);
        }
        else{
            sum=0;
            visited[x][y]=true;
            dfs(x,y,ans);
            cnt[ans++]=sum;
            printf("%d\n",sum);
        }
    }
    return 0;
}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

05-19 15:21
已编辑
门头沟学院 Java
白火同学:你才沟通了200,说实话,北上广深杭这里面你连一座城市的互联网公司都没投满呢,更别说还有各种准一线二线城市了。等你沟通突破了三位数,还没结果再考虑转行的事吧。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 12:04
毕业生招你惹你了,问一个发薪日来一句别看网上乱七八糟的你看哪个工作没有固定发薪日扭头就取消了面试就问了一句公司都是这个态度吗还搞上人身攻击了...
程序员小白条:呃呃呃,都还没面试,我都不会问这么细,何况通不通过,去不去都另说,你没实力和学历的话,在外面就这样,说实话没直接已读不回就不错了,浪费时间基本上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务