题目描述
有一个仅由数字00与11组成的n \times nn×n格迷宫。若你位于一格00上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格11上,那么你可以移动到相邻44格中的某一格00上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入格式
第11行为两个正整数n,mn,m。
下面nn行,每行nn个字符,字符只可能是00或者11,字符之间没有空格。
接下来mm行,每行22个用空格分隔的正整数i,ji,j,对应了迷宫中第ii行第jj列的一个格子,询问从这一格开始能移动到多少格。
输出格式
mm行,对于每个询问输出相应答案。
输入输出样例
输入 #1复制
2 2 01 10 1 1 2 2
输出 #1复制
4 4
说明/提示
所有格子互相可达。
对于20\%20%的数据,n≤10n≤10;
对于40\%40%的数据,n≤50n≤50;
对于50\%50%的数据,m≤5m≤5;
对于60\%60%的数据,n≤100,m≤100n≤100,m≤100;
对于100\%100%的数据,n≤1000,m≤100000n≤1000,m≤100000。
代码如下:记录走过位置的数组需要10^6,总共最多会有10^6个位置!!!
本来自己写的过了一部分,结果一直卡时间,没办法看了一下别人的:来自一只菜鸡的怒吼 - 杨稳健 的博客 - 洛谷博客
才知道可以用标记走过位置,这个点很棒,但是因为没发现数组大小不够,一直向着他的代码修改,结果修的基本都快一模一样了,不想改了,累了!!!
2022/3/10 1:34 明天早八!!
#include<bits/stdc++.h>
using namespace std;
int n , m ;
char ch[10005][10005];
int step[10005][10005];
int v[10005][10005];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int inde[1000005][2];
int bfs(int x , int y){
int ans=1;
queue<int> q1 , q2;
q1.push(x); q2.push(y);
v[x][y]=1;
inde[ans][0]=x; inde[ans][1]=y;
while(!q1.empty() )
{
int a =q1.front() , b=q2.front();
q1.pop();q2.pop();
for(int i=0;i<4;i++)
{
x=a+dx[i];y=b+dy[i];
if(ch[x][y]!=ch[a][b] && ch[x][y]!='\0' && !v[x][y])
{
q1.push(x);
q2.push(y);
ans++;
v[x][y]=1;
inde[ans][0]=x; inde[ans][1]=y;
}
}
}
for(int i=1;i<=ans;i++)
step[inde[i][0]][inde[i][1]]=ans;
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>ch[i][j];
}
}
int x , y;
for(int i=0;i<m;i++)
{
cin>>x>>y;
if(!v[x][y]) cout<<bfs(x,y)<<endl;
else cout<<step[x][y]<<endl;
}
return 0;
}