您的位置:首页 > 其它

洛谷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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: