洛谷OJ P1141 01迷宫 解题报告
2015-05-10 21:28
357 查看
洛谷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了。。。。
有点淡淡的忧伤
【代码】
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define rep(i,l,r) for(i=l;i<=r;i++) #define read scanf #define print printf const int maxn=1001; const int maxm=10000001; struct xOy{ int x,y; }; char graph[maxn][maxn]; int record[maxm],id[maxn][maxn]; xOy q[maxm]; int front,tail; int n,m;//size of the board ; question numbers int datax,datay; void bfs(int x,int y,int index){ front=tail=1; tail=2; q[1]=(struct xOy){x,y}; xOy head; while(front!=tail){ head=q[front]; ++front; if(id[head.x][head.y])continue; id[head.x][head.y]=index; record[index]++; if(head.x-1>=1 && graph[head.x-1][head.y]!=graph[head.x][head.y]) q[tail++]=(struct xOy){head.x-1,head.y}; if(head.y-1>=1 && graph[head.x][head.y-1]!=graph[head.x][head.y]) q[tail++]=(struct xOy){head.x,head.y-1}; if(head.x+1<=n && graph[head.x+1][head.y]!=graph[head.x][head.y]) q[tail++]=(struct xOy){head.x+1,head.y}; if(head.y+1<=n && graph[head.x][head.y+1]!=graph[head.x][head.y]) q[tail++]=(struct xOy){head.x,head.y+1}; } } int main(){ read("%d%d",&n,&m); int i,j,index=1; rep(i,1,n) rep(j,1,n) cin>>graph[i][j]; rep(i,1,n) rep(j,1,n) { bfs(i,j,index); if(record[index])index++; } rep(i,1,m){ read("%d%d",&datax,&datay); print("%d\n",record[id[datax][datay]]); } return 0; }
相关文章推荐
- 洛谷P1141 01迷宫 解题报告
- hdu 1272 小希的迷宫 解题报告
- hdoj 1272 小希的迷宫解题报告
- 【解题报告】hdu1728 逃离迷宫
- HDU-2602___Bone Collector——解题报告 01背包
- 解题报告:POJ_2923 Relocation 状态压缩+01背包
- 数据结构(ZKNU OJ) 迷宫(栈的应用)解题报告
- hdu 1728 逃离迷宫 解题报告
- zjnu 1450 - 迷宫(BFS)解题报告
- HDU1728 逃离迷宫 解题报告--bfs
- hdu 1272 小希的迷宫 解题报告
- HDU-1728 逃离迷宫 解题报告(张浩盛伦)
- poj3984迷宫问题解题报告
- [置顶] HDOJ 1728 逃离迷宫 (BFS )解题报告
- 4000 牛客练习赛12 B迷宫解题报告
- 01 Matrix解题报告
- HDU 1728 解题报告 ---- 逃离迷宫
- HDOJ 1272 小希的迷宫解题报告
- [Leetcode] 542. 01 Matrix 解题报告
- hdoj 1269-迷宫城堡解题报告