1、暴力版

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

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

#include <iostream>
#include <string.h>
#include <stdio.h> int cnt,n;
int dir[][] = { {,},{-,},{,},{,-} };
bool fuck[][];
char s[][]; void dfs(int x, int y) {
for (int k = ; k < ; k++) {
int tox = x + dir[k][], toy = y + dir[k][];
if (!fuck[tox][toy] && s[x][y] != s[tox][toy] && (tox >= && tox < n && toy >= && toy < n)) {
cnt++;
fuck[tox][toy] = true;
dfs(tox, toy);
}
}
}
int main()
{
int t;
scanf("%d%d", &n, &t);
for (int i = ; i < n; i++)scanf("%s", s[i]); int i, j;
while (t--) {
int c1, c2;
memset(fuck, , sizeof(fuck));
cnt = ;
scanf("%d%d",&c1,&c2);
fuck[c1 - ][c2 - ] = true;
dfs(c1 - , c2 - );
printf("%d\n", cnt);
}
return ;
}

2、改进版

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

核心代码:

void dfs(int x, int y,int d) {
for (int k = ; k < ; k++) {
int tox = x + dir[k][], toy = y + dir[k][];
if (!fuck[tox][toy] && s[x][y] != s[tox][toy] && (tox >= && tox < n && toy >= && toy < n)) {
cnt++;
fuck[tox][toy] = d;
dfs(tox, toy, d);
}
}
} for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
if (!fuck[i][j]) {
fuck[i][j] = d;//d表示第几个连通区域
cnt = ;
dfs(i, j, d);
ans[d++] = cnt;
}
}
}

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

#include <iostream>
#include <string.h>
#include <stdio.h> int cnt,n;
int dir[][] = { {,},{-,},{,},{,-} };
int fuck[][];
int ans[];
char s[][]; void dfs(int x, int y,int d) {
for (int k = ; k < ; k++) {
int tox = x + dir[k][], toy = y + dir[k][];
if (!fuck[tox][toy] && s[x][y] != s[tox][toy] && (tox >= && tox < n && toy >= && toy < n)) {
cnt++;
fuck[tox][toy] = d;
dfs(tox, toy, d);
}
}
}
int main()
{
int t;
scanf("%d%d", &n, &t);
for (int i = ; i < n; i++)scanf("%s", s[i]); int i, j, d = ;
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
if (!fuck[i][j]) {
fuck[i][j] = d;
cnt = ;
dfs(i, j, d);
ans[d++] = cnt;
}
}
} while (t--) {
int c1, c2;
scanf("%d%d",&c1,&c2);
printf("%d\n", ans[fuck[c1 - ][c2 - ]]);
}
return ;
}

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

  1. 洛谷——P1141 01迷宫

    P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...

  2. luogu P1141 01迷宫 x

    P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...

  3. P1141 01迷宫

    https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...

  4. 洛谷P1141 01迷宫

    题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...

  5. P1141 01迷宫 dfs连通块

    题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...

  6. P1141 01迷宫 DFS (用并查集优化)

    题目描述 有一个仅由数字00与11组成的n \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上 ...

  7. 洛谷P1141 01迷宫【DFS】

    有一个仅由数字00与11组成的n \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上. 你的任 ...

  8. P1141 01迷宫(连通块模板)

    题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...

  9. 洛谷 P1141 01迷宫

    看似普通的 bfs 题(实际上也不怎么难 主要是我太菜了) 题目链接:https://www.luogu.org/problemnew/show/P1141 如果直接用简单的bfs一顿求的话,会超时( ...

随机推荐

  1. IntelliJ IDEA 2016.2 注册破解激活教程

    下载了IntelliJ IDEA 尽然需要激活,整了终于找到解决的办法了,记录下来. IntelliJ IDEA 2016.2下载地址:http://www.jetbrains.com/idea/do ...

  2. java.lang.IllegalStateException: Restarter has not been initialized

    在IDEA导入devtools依赖实现热布署,启动后遇到如下问题 java.lang.IllegalStateException: Restarter has not been initialized ...

  3. 使用JDBC一次执行多条语句(以MySQL为例)

    阅读本文需要的先修知识: 最基本的SQL语句 最基本的JDBC操作(如插入单条记录) 如急需使用请直接看最后一段代码. 在JDBC中,对记录进行修改操作最简单的方法是使用executeUpdate() ...

  4. 【代码笔记】iOS-键盘自适应弹出

    一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIVie ...

  5. chrome-Firefox-IE浏览器兼容总结

    作为一名WEB前端程序员,相信每个人对浏览器的兼容都"情有独钟",下面就一些常用的浏览器的兼容列举一二. 一.块级元素(block)一般不转化为inline-block,其实是因为 ...

  6. AngularJS学习 之 UI以及逻辑生成

    学习<Angular高级编程>理解如下 要求: 创建如下界面,有导航栏,一个Watchlists面板,面板上有个加号button,一句说明“”Use+to create a list“” ...

  7. NodeJS配置TaoBao源

    npm install -g cnpm --registry=https://registry.npm.taobao.org

  8. 安卓测试【二】eclipse离线安装ADT

    为什么要配置ADT呢?这就相当于在eclipse里插入插件,可以编译android的相关程序. 为什么要离线呢?一个字,快!我在线装了一个下午的ADT,不是报错就是慢的跟头老牛似的. 所以我在网上下了 ...

  9. go语言练习:条件语句和循环语句

    1.for循环+if条件语句简单例子: package main import "fmt" func main() { var a int for a = 0; a <= 2 ...

  10. Web Api通过文件流下载文件到本地实例

    最近项目里面需要和C++的客户端互动,其中一个接口就是需要提供文件下载的接口,保证C++项目调用这个接口的时候能够正常下载文件到本地.参考了一下网上的代码,其原理就是读取服务器上指定路径的文件流,并将 ...