列表

详情


NC23486. 小A与小B

描述

小A与小B这次两个人都被困在了迷宫里面的两个不同的位置,而他们希望能够迅速找到对方,然后再考虑如何逃离迷宫的事情。小A每次可以移动一个位置,而小B每次可以移动两次位置,小A移动的方向是上下左右左上左下右上右下8个方向,小B移动的方向是上下左右4个方向,请问他们最早什么时候能够找到对方,如果他们最终无法相遇,那么就输出”NO"。

输入描述


输出描述

如果可以相遇,第一行输出一个YES,第二行一个整数输出最短的相遇时间。
否则就输出一个NO表示不能相遇。

示例1

输入:

4 5
. . . . .
. # # # .
. . . # D
. . C # .

输出:

YES
3

原站题解

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

Python3 解法, 执行用时: 886ms, 内存消耗: 27548K, 提交时间: 2023-01-17 15:26:35

from collections import deque

n,m=[int(x) for x in input().split()]
dirs=[[1,0],[-1,0],[0,1],[0,-1],[1,1],[-1,-1],[1,-1],[-1,1]]
g=[['']*m for i in range(n)]
vis = [[[0]*m for i in range(n)] for _ in range(2)]
q=[deque() for i in range(2)]
for i in range(n):
    r=[x for x in input().split()]
    for j in range(m):
        if r[j]=='C':
            q[0].append([i,j])
            vis[0][i][j]=1
        if r[j]=='D':
            q[1].append([i,j])
            vis[1][i][j]=1
        g[i][j]=r[j]

def bfs(t):
    for _ in range(len(q[t])):
        i,j=q[t].popleft()
        for k in range(4 if t else 8):
            dx,dy=dirs[k]
            x,y=i+dx,j+dy
            if x<0 or x>=n or y<0 or y>=m or vis[t][x][y] or g[x][y]=='#': continue
            if vis[1-t][x][y]: return 1
            vis[t][x][y]=1
            q[t].append([x,y])
    return 0
def sol():
    res = 0
    while len(q[0]) or len(q[1]):
        res+=1
        if bfs(0): return res
        if bfs(1): return res
        if bfs(1): return res
    return -1
ans = sol()
if ans==-1: print('NO')
else:
    print('YES')
    print(ans)

C++14(g++5.4) 解法, 执行用时: 59ms, 内存消耗: 6232K, 提交时间: 2020-06-04 11:41:17

#include<bits/stdc++.h>
using namespace std;
struct qw
{
    int x,y;
}t;
int n,m,vis[2][1005][1005],step=0;
char a[1005][1005];
queue<qw> q[2];
int dx[]={0,0,1,-1,1,1,-1,-1},dy[]={1,-1,0,0,1,-1,1,-1};
void bfs(int w)
{
    int len=q[w].size();
    while(len--)
    {
        t=q[w].front();q[w].pop();
        for(int i=0;i<4+(w==0?4:0);i++)
        {
            int bx=t.x+dx[i],by=t.y+dy[i];
            if(bx>n||bx<1||by>m||by<1||vis[w][bx][by]||a[bx][by]=='#') continue;
            vis[w][bx][by]=1;q[w].push((qw){bx,by});
            if(vis[w^1][bx][by]) {cout<<"YES"<<endl<<step<<endl;exit(0);}
        }
    }
}
void solve()
{
    while(step<=n*m)
    {
        step++;
        bfs(0);
        bfs(1);
        bfs(1);
    }
    cout<<"NO"<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    int i,j;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    {
        cin>>a[i][j];
        if(a[i][j]=='C') q[0].push((qw){i,j}),vis[0][i][j]=1;
        if(a[i][j]=='D') q[1].push((qw){i,j}),vis[1][i][j]=1;
    }
    solve();
}

C++11(clang++ 3.9) 解法, 执行用时: 33ms, 内存消耗: 4580K, 提交时间: 2019-04-14 13:17:26

#include<bits/stdc++.h>
using namespace std;
struct qw
{
	int x,y;
}t;
int n,m,vis[2][1005][1005],step=0;
char a[1005][1005];
queue<qw> q[2];
int dx[]={0,0,1,-1,1,1,-1,-1},dy[]={1,-1,0,0,1,-1,1,-1}; 
void bfs(int w)
{
	int len=q[w].size();
	while(len--)
	{
		t=q[w].front();q[w].pop(); 
		for(int i=0;i<4+(w==0?4:0);i++)
		{
			int bx=t.x+dx[i],by=t.y+dy[i];
			if(bx>n||bx<1||by>m||by<1||vis[w][bx][by]||a[bx][by]=='#') continue;
			vis[w][bx][by]=1;q[w].push((qw){bx,by}); 
			if(vis[w^1][bx][by]) {cout<<"YES"<<endl<<step<<endl;exit(0);}
		}
	}
}
void solve()
{
	while(step<=n*m)
	{
		step++;
		bfs(0);
		bfs(1);
		bfs(1);
	}
	cout<<"NO"<<endl;
}
int main()
{
	ios::sync_with_stdio(false);
	int i,j;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++) 
	{
		cin>>a[i][j];
		if(a[i][j]=='C') q[0].push((qw){i,j}),vis[0][i][j]=1;
		if(a[i][j]=='D') q[1].push((qw){i,j}),vis[1][i][j]=1;
	}
	solve();
}

上一题