随手练——P1141 01迷宫

1、暴力版

本质上就是求连通块数量,那么DFS或者BFS都行,暴力跑。

写完发现题目比较特殊,m次提问,那每次都暴力搜,肯定是要跑死了。

#include <iostream>
#include <string.h>
#include <stdio.h>

int cnt,n;
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
bool fuck[1005][1005];
char s[1005][1005];

void dfs(int x, int y) {
    for (int k = 0; k < 4; k++) {
        int tox = x + dir[k][0], toy = y + dir[k][1];
        if (!fuck[tox][toy] && s[x][y] != s[tox][toy] && (tox >= 0 && tox < n && toy >= 0 && toy < n)) {
            cnt++;
            fuck[tox][toy] = true;
            dfs(tox, toy);
        }
    }
}
int main()
{
    int t;
    scanf("%d%d", &n, &t);
    for (int i = 0; i < n; i++)scanf("%s", s[i]);

    int i, j;
    while (t--) {
        int c1, c2;
        memset(fuck, 0, sizeof(fuck));
        cnt = 1;
        scanf("%d%d",&c1,&c2);
        fuck[c1 - 1][c2 - 1] = true;
        dfs(c1 - 1, c2 - 1);
        printf("%d\n", cnt);
    }
    return 0;
}

2、改进版

要确定:每个联通区域的答案是一样的,就好办了。

核心代码:

void dfs(int x, int y,int d) {
    for (int k = 0; k < 4; k++) {
        int tox = x + dir[k][0], toy = y + dir[k][1];
        if (!fuck[tox][toy] && s[x][y] != s[tox][toy] && (tox >= 0 && tox < n && toy >= 0 && toy < n)) {
            cnt++;
            fuck[tox][toy] = d;
            dfs(tox, toy, d);
        }
    }
}

for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (!fuck[i][j]) {
                fuck[i][j] = d;//d表示第几个连通区域
                cnt = 1;
                dfs(i, j, d);
                ans[d++] = cnt;
            }
        }
    }

算是比较特殊的一种打表吧。

#include <iostream>
#include <string.h>
#include <stdio.h>

int cnt,n;
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int fuck[1005][1005];
int ans[1000005];
char s[1005][1005];

void dfs(int x, int y,int d) {
    for (int k = 0; k < 4; k++) {
        int tox = x + dir[k][0], toy = y + dir[k][1];
        if (!fuck[tox][toy] && s[x][y] != s[tox][toy] && (tox >= 0 && tox < n && toy >= 0 && toy < n)) {
            cnt++;
            fuck[tox][toy] = d;
            dfs(tox, toy, d);
        }
    }
}
int main()
{
    int t;
    scanf("%d%d", &n, &t);
    for (int i = 0; i < n; i++)scanf("%s", s[i]);

    int i, j, d = 1;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (!fuck[i][j]) {
                fuck[i][j] = d;
                cnt = 1;
                dfs(i, j, d);
                ans[d++] = cnt;
            }
        }
    }

    while (t--) {
        int c1, c2;
        scanf("%d%d",&c1,&c2);
        printf("%d\n", ans[fuck[c1 - 1][c2 - 1]]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/czc1999/p/10651758.html

时间: 2024-08-09 23:24:55

随手练——P1141 01迷宫的相关文章

luogu P1141 01迷宫 x

P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移

洛谷OJ P1141 01迷宫 解题报告

洛谷OJ P1141 01迷宫 解题报告 by MedalPluS [题目描述]    有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身).   [输入描述]   输入的第1行为两个正整数n,m.  下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格.  接下来m行,每行2个用空格分隔的正整数i,j,对

洛谷——P1141 01迷宫

https://www.luogu.org/problem/show?pid=1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整

P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式

luogu cogs P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式

P1141 01迷宫(连通块模板)

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入格式 第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式 m行,对于每个询问输

luogu P1141 01迷宫

https://www.luogu.org/problem/show?pid=1141 还不太会用 BFS 然后就跟着感觉走了一波 经历了很多错误 刚开始的读入 然后BFS的过程 最后T三个点 看到别人的题解思路 后 自己改了一次 用dp[i][j] 记录 i ,j是在哪个联通快里面的 然后 ans[cnt] 记录 第cnt个联通块的结果 //bfs + 记忆话搜索 #include<bits/stdc++.h> using namespace std; typedef pair<int

Luogu P1141 01迷宫【搜索/dfs】By cellur925

题目传送门 我tm到现在还需要刷这种水搜索...我退役吧. 但就是搜索弱嘛 补一补嘛qwq 题目大意:给你一张地图与许多询问,每次询问求这个点所在联通块的点的个数. 所以这个题目的本质就是在求联通块.可以联想到那天测试的题,把看似bfs的题写成dfs. 注意:联通块数组开小了导致RE=== 1 #include<cstdio> 2 #include<queue> 3 #include<algorithm> 4 #include<cstring> 5 6 us

1629 01迷宫

1629 01迷宫 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.那么对于给定的迷宫,询问从某一格开始能移动到多少格. 输入描述 Input Description 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之