01迷宫(maze01)

Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

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

动到相邻4格中的某一格0上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

【输入格式】

输入文件maze01.in的第1行为两个正整数n,m。下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。

【输出格式】

输出文件maze01.out包括m行,对于每个询问输出相应答案。

【数据规模】

对于20%的数据,n≤10; 对于40%的数据,n≤50;对于50%的数据,m≤5;对于60%的数据,n≤100,m≤100;对于100%的数据,n≤1000,m≤100000。

Sample Input1

2 2
01
10
1 1
2 2

Sample Output1

4
4

【样例说明】

所有格子互相可达。
 

【题解】

所有格子互通,可以联想到连通块->广搜。这题和细胞那题很像,也是从第一行for到最后一行,从第一列for到最后一列。遇到一个bo[i][j] == true,则从i,j这个点开始找联通块。

找完连通块后,队列仍然保留在那里,可以利用队列,确定哪些位置是同一个连通块,只要全部赋值成相同的数字就好,这个数字是这次广搜到的格子数量。

【代码】

#include <cstdio>
#include <string>
#include <iostream> using namespace std; const int ddx[5] = {0,0,0,1,-1};
const int ddy[5] = {0,1,-1,0,0}; int n,m,dl[1000000][2],ans[1001][1001];
string s3;
bool bo[1001][1001];
bool a[1001][1001]; void input_data()
{
scanf("%d %d",&n,&m);
for (int i = 1;i <= n;i++)
{
cin >> s3;
for (int j = 1;j <=n;j++) //把字符串转换成bool型的数据用于储存图的信息。
if (s3[j-1] == '0')
a[i][j] = false;
else
a[i][j] = true;
}
for (int i = 1;i <= n;i++) //一开始所有的格子都可以广搜
for (int j = 1;j <= n;j++)
bo[i][j] = true;
} void bfs(int x,int y) //从(x,y)开始广搜
{
bo[x][y] = false;
int head = 1,tail = 1,num = 1; //队列的头结点和尾结点
dl[1][0] = x;dl[1][1] = y; //将(x,y)首先入队。
while (head <= tail)
{
int xx = dl[head][0],yy = dl[head][1];//取出头结点
head ++;//要记住头结点要递增
for (int i = 1;i <= 4;i++) //往四个方向扩展
{
int dx = xx + ddx[i],dy = yy + ddy[i];
if (dx < 0) continue; //如果越界了 要跳过
if (dx > n) continue;
if (dy < 0) continue;
if (dy > n) continue;
if (a[dx][dy] == a[xx][yy]) continue;//如果这个格子和原来的格子数字相同也要跳过
if (bo[dx][dy]) //如果这个格子没有被走过 那么就走到这个格子
{
bo[dx][dy] = false; //标记这个格子已经走过
dl[++tail][0] = dx; //把这个位置记录在队列中
dl[tail][1] = dy;
num++; //走过的格子数目递增
} }
}
for (int i =1;i <= tail;i++)
ans[dl[i][0]][dl[i][1]] = num; //把刚才从(x,y)能走到的格子全部赋值成刚才走过的格子数目
} void get_ans()
{
for (int i = 1;i <=n;i++) //如果某个格子能够进行广搜,就从那个格子开始广搜
for (int j = 1;j <= n;j++)
if (bo[i][j])
bfs(i,j);
} void output_ans()
{
for (int i = 1;i <= m;i++) //対每个提问 直接回答就好。
{
int w,e;
scanf("%d %d",&w,&e);
printf("%d\n",ans[w][e]);
}
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}

【u115】&&【t031】 01迷宫的更多相关文章

  1. 01迷宫 洛谷 p1141

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

  2. [LuoguP1141]01迷宫

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

  3. 洛谷——P1141 01迷宫

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

  4. Codevs 1629 01迷宫

    1629 01迷宫 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可 ...

  5. luogu P1141 01迷宫 x

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

  6. 洛谷P1141 01迷宫

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

  7. P1141 01迷宫

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

  8. P1141 01迷宫 dfs连通块

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

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

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

随机推荐

  1. [Angular & Web] Retrieve user data from Session

    Once user sign up, we store the user data inside cookie in the broswer and also keep a memory copy i ...

  2. [RxJS] Avoid mulit post requests by using shareReplay()

    With the shareReplay operator in place, we would no longer fall into the situation where we have acc ...

  3. poj 1191 棋盘切割 (压缩dp+记忆化搜索)

    一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include & ...

  4. zookeeper分布式协调服务的使用一

    Zookeeper是一个高性能,分布式的应用协调服务. 提供服务: 1.集群成员的管理(Group Membership) 2.分布式锁(Locking) 3.选主(Leader Election) ...

  5. Intel X86 CPU 系列的寻址方式

    Intel X86 CPU 系列的寻址方式 数据总线和地址总线要尽量相同,这个是一个地址就是一个指针.

  6. Springboot + shiro 整合之Url拦截设置(转)

    shiro 整合到springboot 还是比较简单的,只需要新建一个spring-shiro.xml的配置文件: <span style="font-size:14px;" ...

  7. UIButton UIBarButtonItem用法

    #pragma mark 快速创建一个item - (UIBarButtonItem *)itemWithNormal:(NSString *)normal highlighted:(NSString ...

  8. 【u248】交通序列号

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在一条笔直的道路上共有N个路口,每个路口处都有关于该条道路的通行的信号灯. 显然,信号灯共有绿(G). ...

  9. 编译pano13的一些注意事项

    作者:朱金灿 来源:error C2037: "jmpbuf"的左侧部分指定未定义的结构/联合"png_struct_def"e:\src\Test\libpa ...

  10. python链表的实现,有注释

    class Node():                   #node实现,每个node分为两部分:一部分含有链表元素,成数据域;另一部分为指针,指向下一个  __slots__=['_item' ...