学军信友队趣味网络邀请赛 A核酸检测

题目

冠状病毒疫情爆发!某城市内大量疑似患者被集中到各个隔离点,初期确诊非常困难,专家团队需要依次到这些隔离点去现场指导,为疑似患者进行核酸检测。
城市共有 n * (n + 1) 个隔离点,它们形成了 n 行 n + 1 列的方阵。我们用 (r, c) 表示位于从上到下第 r 行、从左到右第 c 列的隔离点。例如,左上角的坐标是 (1, 1), 右下角的坐标是 (n, n + 1)。
该城市的交通结构比较特殊,任意两个对角方向的相邻隔离点之间有一条双向通路。 此外,在方阵的边界处有一条顺时针运行的单向地铁环线。下图是一个 n = 5 的城市示意图:
在这里插入图片描述
专家可以从任意一个隔离点出发,之后你可以沿着道路或乘坐地铁前往其他隔离点。 走过一条道路、乘坐一段地铁都需要 1 单位时间。在隔离点处进行核酸检测所需的时 间忽略不计。
专家迫切想要知道最少需要多少时间才能完成所有隔离点的核酸检测。请求出最少需 要的时间,以及一条路线。
输入描述
输入共一行,包含一个整数 n (2 <= n <= 100),表示隔离点方阵的行数。
输出描述
第一行输出一个整数,表示花费的时间 T 。 接下来包含 T + 1 行。这部分的第 i 行包含两个整数 xi, yi,用一个空格隔开,表示你构造出的路线经过的第 i 个隔离点坐标是(xi, yi)。
如果存在多种可行的方案,请输出任意一种可行的方案。
样例输入

2

样例输入

5
1 1
1 2
1 3
2 3
2 2
2 1

分析

开始看到数据规模,以为是dp没想到,是一道规律+模拟
1.怎样跑最短 -> 我们只需要保证在路径中没有重复经过某个点
2.对于n的奇偶性不同,我找出了下面的走法
1)n为奇数(这里我们以5为例)
在这里插入图片描述
2)n为偶数(这里我们以4为例)
在这里插入图片描述
3.根据前面几个数据的路径长度推出规律 -> t = n * n + (n - 1);

AC代码

#include <iostream>

using namespace std;

const int N = 110;

int n;
bool vis[N][N];

bool dfs (int x, int y, int cnt) // 奇数
{
    if(cnt == n * (n + 1)) return true;

    cout << x << " " << y << endl;

    if(y & 1)
    {
        if(x == 1) 
        {
            if(dfs(x, y + 1, cnt + 1)) return true;
        }
        else if(x & 1) 
        {
            if(dfs(x - 1, y + 1, cnt + 1)) return true; // 奇数行
        }
        else 
        {
            if(dfs(x + 1, y + 1, cnt + 1)) return true; // 偶数行
        }
    }
    else
    {
        if(x == n) 
        {
            if(dfs(x, y - 1, cnt + 1)) return true;
        }
        if(x & 1) 
        {
            if(dfs(x + 1, y - 1, cnt + 1)) return true;
        }
        else if(x == 2) 
        {
            if(dfs(x - 1, y + 1, cnt + 1)) return true;
        }
        else 
        {
            if(dfs(x - 1, y - 1, cnt + 1)) return true;
        }
    }
}

bool dfs2 (int x, int y, int cnt) // 偶数
{
    if(cnt == n * (n + 1)) return true;

    cout << x << " " << y << endl;

    if(x & 1)
    {
        if(y == n + 1)
        {
            if(dfs2(x + 1, y, cnt + 1)) return true;
        }
        if(y & 1)
        {
            if(dfs2(x + 1, y + 1, cnt + 1)) return true;
        }
        else if(y == 2)
        {
            if(dfs2(x - 1, y - 1, cnt + 1)) return true;
        }
        else
        {
            if(dfs2(x + 1, y - 1, cnt + 1)) return true;
        }
    }
    else
    {
        if(y == 1)
        {
            if(dfs2(x - 1, y, cnt + 1)) return true;
        }
        else if(y & 1)
        {
            if(dfs2(x - 1, y - 1, cnt + 1)) return true;
        }
        else
        {
            if(dfs2(x - 1, y + 1, cnt + 1)) return true;
        }
    }
}

int main ()
{
    cin >> n;

    cout << n * n + (n - 1) << endl;

    if(n & 1) dfs(1, 1, 0);
    else dfs2(n, 1, 0);

    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值