列表

详情


NC206192. Maze

描述

多多在一个N行M列的迷宫中,迷宫只由符号 '+' 或 '-' 组成。如果多多在 '+' 上,下一步只能走到上、下、左、右四个方向的 '-' 上;如果多多在 '-' 上,下一步只能走到上、下、左、右四个方向的 '+' 上。多多希望能走到更多的格子上,所以他想知道:从某一位置开始能走到多少个格子?(包含开始位置) 多多会询问 Q 次,请你耐心的回答他。

输入描述

输入第一行包含三个正整数N,M,Q (1 ≤ N ≤ 3000,1 ≤ M ≤ 3000,1 ≤ Q ≤ 30000)
接下来 N 行输入长度为 M 的字符串
接下来 Q 行每行输入一个位置坐标,代表起始位置的行和列(从1,1开始)

输出描述

对于每次询问,输出一个正整数,表示从该位置能走到的格子数

示例1

输入:

3 3 4
-+-
--+
+-+
1 1
2 1
2 2
3 3

输出:

5
4
5
4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 563ms, 内存消耗: 49280K, 提交时间: 2023-04-07 20:58:39

#include<bits/stdc++.h>
using namespace std;
int n,m,q,w,cnt;
char a[3010][3010];
int s[3010][3010];
int v[9100010];
int d[4][2]={1,0,0,1,-1,0,0,-1};
void dfs(int x,int y)
{
    v[cnt]++;
    s[x][y]=cnt;
    for(int i=0;i<4;i++)
    {
        int dx=x+d[i][0];
        int dy=y+d[i][1];
        if(a[dx][dy]!=a[x][y]&&dx>=0&&dx<n&&dy>=0&&dy<m&&!s[dx][dy])
            dfs(dx,dy);
    }
}

int main()
{
    cin>>n>>m>>q;
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
               if(!s[i][j])
                   cnt++,dfs(i,j);
    while(q--)
    {
        int x,y;
        cin>>x>>y;
        cout<<v[s[x-1][y-1]]<<endl;
    }
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 383ms, 内存消耗: 84344K, 提交时间: 2020-08-23 14:01:19

#include<cstdio>
using namespace std;
const int maxn=3003;
int n,m,q,tot=0;
int sz[maxn*maxn],cnt[maxn][maxn],vis[maxn][maxn];
char a[maxn][maxn];
int d[4][2]={1,0,-1,0,0,1,0,-1};
void dfs(int x,int y,int z){
	vis[x][y]=1;
	++sz[tot];
	cnt[x][y]=z;
	for(int i=0;i<4;++i){
		int a1=x+d[i][0],b1=y+d[i][1];
		if(!vis[a1][b1]&&a1>=1&&a1<=n&&b1>=1&&b1<=m&&a[a1][b1]!=a[x][y])
			dfs(a1,b1,z);
	} 
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;++i)
		scanf("%s",a[i]+1);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(!vis[i][j])
				dfs(i,j,++tot);
	while(q--){
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",sz[cnt[x][y]]);
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 416ms, 内存消耗: 49516K, 提交时间: 2020-06-19 12:58:33

#include<bits/stdc++.h>
using namespace std;

int n,m,q,ans[9000005]={0},T[3005][3005]={0};
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
char R[3005][3005];
void DFS(int x,int y,int z)
{
	int i,X,Y;
	for(i=0;i<4;i++)
	{
		X=x+dx[i],Y=y+dy[i];
		if(X<0||X>=n||Y<0||Y>=m||T[X][Y]||R[x][y]==R[X][Y])continue;
		T[X][Y]=z,ans[z]++,DFS(X,Y,z);
	}
} 
int main()
{
    int i,j,t=0;
    scanf("%d%d%d",&n,&m,&q);
    for(i=0;i<n;i++)scanf("%s",R[i]);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)if(!T[i][j])T[i][j]=++t,ans[t]++,DFS(i,j,t);
	while(q--)
	{
		scanf("%d%d",&i,&j);
		printf("%d\n",ans[T[i-1][j-1]]);
	}
}

上一题