洛谷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,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。

  【输出描述】

输出包括m行,对于每个询问输出相应答案。

  【分析】

   此题比较坑爹

   题目的意思就是求对于一个点所在的联通块的个数

然后笔者想到了并查集和Tarjan

结果看了下范围n<=1000,m<=100000,然后就放弃了。。。

仔细想想其实就是个BFS

然后发现时间复杂度是O(n2m)

然后还是TLE,就要考虑优化了

我们发现,对于一个点所拓展的路径上的所有点能走的格子数是一样的!

那么也就是说,我们可以预处理出整个图

这让我们联想到Flood_fill

然后笔者就采用了DFS的方式

然后就爆栈了,发现对于1000*1000的完全图(全都是1或0)会达到106层,所以必定会爆

这个时候可以考虑采用BFS的方式Flood_fill

然后就TLE了,笔者发现主要拖慢时间的是采取了STL的队列

特别特别的耗时间,然后就手写个队列,再加卡常数的读入

就AC了。。。。

有点淡淡的忧伤

【代码】

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 #define rep(i,l,r) for(i=l;i<=r;i++)
 7 #define read scanf
 8 #define print printf
 9
10 const int maxn=1001;
11 const int maxm=10000001;
12
13 struct xOy{
14     int x,y;
15 };
16
17 char graph[maxn][maxn];
18 int record[maxm],id[maxn][maxn];
19 xOy q[maxm];
20 int front,tail;
21 int n,m;//size of the board ; question numbers
22 int datax,datay;
23
24 void bfs(int x,int y,int index){
25     front=tail=1;
26     tail=2;
27     q[1]=(struct xOy){x,y};
28     xOy head;
29     while(front!=tail){
30         head=q[front];
31         ++front;
32         if(id[head.x][head.y])continue;
33         id[head.x][head.y]=index;
34         record[index]++;
35         if(head.x-1>=1 && graph[head.x-1][head.y]!=graph[head.x][head.y])
36           q[tail++]=(struct xOy){head.x-1,head.y};
37         if(head.y-1>=1 && graph[head.x][head.y-1]!=graph[head.x][head.y])
38           q[tail++]=(struct xOy){head.x,head.y-1};
39         if(head.x+1<=n && graph[head.x+1][head.y]!=graph[head.x][head.y])
40           q[tail++]=(struct xOy){head.x+1,head.y};
41         if(head.y+1<=n && graph[head.x][head.y+1]!=graph[head.x][head.y])
42           q[tail++]=(struct xOy){head.x,head.y+1};
43     }
44 }
45
46 int main(){
47     read("%d%d",&n,&m);
48     int i,j,index=1;
49     rep(i,1,n)
50       rep(j,1,n)
51         cin>>graph[i][j];
52     rep(i,1,n)
53       rep(j,1,n)
54       {
55         bfs(i,j,index);
56         if(record[index])index++;
57       }
58     rep(i,1,m){
59         read("%d%d",&datax,&datay);
60         print("%d\n",record[id[datax][datay]]);
61     }
62     return 0;
63 }
时间: 2024-11-03 05:42:41

洛谷OJ P1141 01迷宫 解题报告的相关文章

洛谷OJ P1010 幂次方 解题报告

洛谷OJ P1010 幂次方 解题报告 by MedalPluS 题目描述   任何一个正整数都可以用2的幂次方表示.例如        137=2^7+2^3+2^0         同时约定方次用括号来表示,即a^b 可表示为a(b).由此可知,137可表示为:        2(7)+2(3)+2(0)进一步:7= 2^2+2+2^0   (21用2表示)        3=2+20   所以最后137可表示为:        2(2(2)+2+2(0))+2(2+2(0))+2(0)又如

洛谷OJ P1074 靶形数独 解题报告

洛谷OJ P1074 靶形数独 解题报告 by MedalPluS 题目描述  小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,

洛谷OJ P1433 吃奶酪 解题报告

洛谷OJ P1433 吃奶酪 解题报告 by MedalPluS 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入描述 第一行一个数n  (n<=15)接下来每行2个实数,表示第i块奶酪的坐标.两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出描述 一个数,表示要跑的最少距离,保留2位小数. 分析 这题很明显就是一个搜索题,枚举一下1_n的全排列,然后从0开始,按照排列一个一个算,时间

洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)

https://www.luogu.org/problem/show?pid=1141 题意:n*n地图,0可以走到相邻的某个1上,1可以走到相邻的某个0上,m次询问,问(x,y)能走到多少个格子? n<=1e3,m<=1e5.若点a能到b,则b也能到a.显然a,b能到达的点相同,同一个联通块内的ans是相同的,即求点所在的连通块大小 #include <bits/stdc++.h> using namespace std; const int N=2e3+20; int dx[4

洛谷1098 字符串的展开 解题报告

洛谷1098 字符串的展开 本题地址:http://www.luogu.org/problem/show?pid=1098 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”.在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下:(1) 遇到下面的情

洛谷1125 笨小猴 解题报告

洛谷1125 笨小猴 本题地址:http://www.luogu.org/problem/show?pid=1125 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入输

洛谷P1162 填涂颜色 解题报告

by MedalPluS 题目描述: 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和   涂色后的方阵如下:0 0 0 0 0 0      0 0 0 0 0 00 0 1 1 1 1      0 0 1 1 1 10 1 1 0 0 1      0 1 1 2 2 11 1 0 0 0 1      1 1 2 2 2 1 1 0 0 0 0 1      1 2 2

洛谷 P2469 [SDOI2010]星际竞速 解题报告

题目描述 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一. 赛车大赛的赛场由N颗行星和M条双向星际航路构成,其中每颗行星都有一个不同的引力值.大赛要求车手们从一颗与这N颗行星之间没有任何航路的天体出发,访问这N颗行星每颗恰好一次,首先完成这一目标的人获得胜利. 由于赛制非常开放,很多人驾驶着千奇百怪的自制赛车来参赛.这次悠悠驾驶的赛车名为超能电驴,这是一部凝聚了全银河最尖端科技结晶的梦幻赛车.作为最高科技的

洛谷 P3253 [JLOI2013]删除物品 解题报告

P3253 [JLOI2013]删除物品 题目描述 箱子再分配问题需要解决如下问题: (1)一共有\(N\)个物品,堆成\(M\)堆. (2)所有物品都是一样的,但是它们有不同的优先级. (3)你只能够移动某堆中位于顶端的物品. (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端.若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动. (5)求出将所有物品删除所需的最小步数.删除操作不计入步数之中. (6)只是一个比较难解决的问题,这里你只需要解决一个比较简单的版本: 不会有