Colorful Grid Codeforces Round 910 (Div. 2) C

Problem - C - Codeforces

题目大意:有一个n*m的网格,要求从(1,1)走到(n,m),同时要求路径的长度必须为k+1,然后给每个两点之间的路径染成红色或蓝色,要求任意两个相邻线段颜色不能相同,求涂色的方案

3<=n,m<=16;1<=k<=1e9

思路:首先如果要从(1,1)走到(n,m),最短路径上的线段数len=n-1+m+1,如果k<len,就没有构造方案,其他情况下,这个最短路上的颜色直接一个红一个蓝即可,接下来考虑我们还要走的k-len条线段,

        在到达终点后,我们可以在终点所在的那个小正方形里绕圈,这样就能满足所有的k=len+4x,如下图中被圈起来的部分:

然后考虑其他的k能否被走出来,我们发现,如果在到终点前,在右下角的小三角上面绕一下,就可以走len+2步,然后因为n>=3,所以可以在右下再上面一个小正方形里绕圈,这样就得到了所有的k=len+2+4x,如下图:

这样的话所有的偶数k-len就能都能找到一种合法的走法,然后发现如果k-len是奇数,无论如何都找不到一种走法,所以根据k和冷的关系分类讨论即可

#include<bits/stdc++.h>
//#include<__msvc_all_public_headers.hpp>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
const ll MOD = 1e9 + 7;
int n;
int m;
ll a[N];
char ma1[20][20],ma2[20][20];
void init()
{
    for (int i = 1; i <= n; i++)
    {//先都初始化成任意颜色
        for (int j = 1; j <= m; j++)
        {
            ma1[i][j] = 'R';
            ma2[i][j] = 'R';
        }
    }
}
void solve()
{
    cin >> n;
    cin >> m;
    init();
    ll k;
    cin >> k;
    ll len = n - 1 + m - 1;
    if (k < len || (k - len) % 2 == 1)
    {//k<最短路或k-最短路是奇数,就没有合法路线
        cout << "NO\n";
        return;
    }
    cout << "YES\n";
    if ((k - len) % 4 == 0)
    {//k-len是4的倍数,就要去右下角的正方形绕圈
        for (int i = 1; i <= n-1; i++)
        {涂最左一列的最短路
            if (i & 1)
                ma1[i][1] = 'R';
            else
                ma1[i][1] = 'B';
        }
        if (ma1[n - 1][1] == 'R')
            ma2[n][1] = 'B';//涂最下面一行最短路
        else
        {
            ma2[n][1] = 'R';
        }
        for (int i = 2; i <= m-1; i++)
        {
            if (ma2[n][i-1] == 'R')
                ma2[n][i] = 'B';
            else
                ma2[n][i] = 'R';
        }
        if (ma2[n][m - 1] == 'R')//涂右下角的小正方形
            ma1[n - 1][m] = ma1[n - 1][m - 1] = 'B';
        else
            ma1[n - 1][m] = ma1[n - 1][m - 1] = 'R';
        ma2[n - 1][m - 1] = ma2[n][m - 1];
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m - 1; j++)
            {
                cout << ma2[i][j] << " ";
            }
            cout << '\n';
        }
        for (int i = 1; i <= n - 1; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                cout << ma1[i][j] << " ";
            }
            cout << '\n';
        }
        return;
    }
    if ((k - len - 2) % 4 == 0)
    {//k-len-2是4的倍数,最后一个小正方形往上绕
        for (int i = 1; i <= n - 1; i++)
        {//涂最左一列
            if (i & 1)
                ma1[i][1] = 'R';
            else
                ma1[i][1] = 'B';
        }
        if (ma1[n - 1][1] == 'R')
            ma2[n][1] = 'B';//涂最下面一行
        else
        {
            ma2[n][1] = 'R';
        }
        for (int i = 2; i <= m - 1; i++)
        {
            if (ma2[n][i - 1] == 'R')
                ma2[n][i] = 'B';
            else
                ma2[n][i] = 'R';
        }
        if (ma2[n][m - 2] == 'R')//涂右下角小正方形
            ma1[n - 1][m] = ma1[n - 1][m - 1] = 'B';
        else
            ma1[n - 1][m] = ma1[n - 1][m - 1] = 'R';
        ma2[n - 1][m - 1] = ma2[n][m - 2];//涂右下角上面一个小正方形
        if (ma2[n - 1][m - 1] == 'R')
        {
            ma1[n - 2][m] = ma1[n - 2][m - 1] = 'B';
        }
        else
        {
            ma1[n - 2][m] = ma1[n - 2][m - 1] = 'R';
        }
        ma2[n - 2][m - 1] = ma2[n - 1][m - 1];
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m - 1; j++)
            {
                cout << ma2[i][j] << " ";
            }
            cout << '\n';
        }
        for (int i = 1; i <= n - 1; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                cout << ma1[i][j] << " ";
            }
            cout << '\n';
        }
    }
    cout << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/245530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将程序注册为系统服务

cmd中执行命令&#xff1a; sc create Redis binpath "C:\guet_run1\Redis-x64-5.0.14.1\redis-server.exe" type own start auto displayname "Redis"注意&#xff0c;命令中所有的等号和值之间需要一个空格&#xff08;等号前不要空格&#xff0c;等号后…

Linux---查看命令帮助

1. 查看命令帮助方式 --help 使用说明: 命令 --helpman 使用说明: man 命令 查看命令帮助的目的说明: 查看命令帮助目的是查看命令选项信息的 --help效果图: man效果图: man命令的说明: 操作键说明空格显示下一屏信息回车显示下一行信息b显示上一屏信息f显示下一屏信息q退…

[c++] 意识需要转变的一个例子,全局变量的构造函数先于main执行

最近还遇到一个例子是关于&#xff1a;从C转C开发需要注意的一个意识问题。本人遇到的这个问题是&#xff0c;带着C的意识来看C的代码&#xff0c;然后根据代码看&#xff0c;有一个全局变量的值在main函数进入之后才会更改&#xff0c;所以百思不得其解&#xff0c;这个变量怎…

RK3568平台 OTA升级原理

一.前言 在迅速变化和发展的物联网市场&#xff0c;新的产品需求不断涌现&#xff0c;因此对于智能硬件设备的更新需求就变得空前高涨&#xff0c;设备不再像传统设备一样一经出售就不再变更。为了快速响应市场需求&#xff0c;一个技术变得极为重要&#xff0c;即OTA空中下载…

ES中根据主键_id查询记录

一、需求 es中_type&#xff1a;_doc&#xff0c;想要根据主键_id查询记录 二、实现 复合查询中使用语句查询http://192.168.1.1/_doc/1

智能分析/可视化安防监控系统EasyCVR风光互补远程视频监控方案

一、背景需求 在一些偏远地区&#xff0c;也具有视频监控的需求。但是这类场景中&#xff0c;一般无法就近获取市电&#xff0c;如果要长距离拉取市电&#xff0c;建设的成本非常高且长距离传输有安全隐患&#xff0c;因此风光互补远程视频监控方案的需求也较多。利用风光电转…

将创建表字段语句快速转换成golang struct字段

用网页jquery快速生成 本地建立 struct.html <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>leo-转换</title> <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></s…

代码审计是什么,为什么需要代码审计

随着软件开发技术的不断发展&#xff0c;代码审计变得越来越重要&#xff0c;因为它可以帮助帮助企业从安全角度对应用系统的所有逻辑路径进行测试&#xff0c;通过分析源代码&#xff0c;充分挖掘代码中存在的安全缺陷以及规范性缺陷。找到普通安全测试所无法发现的如二次注入…

Visual Studio Code中tasks.json全局任务命令选项CommandOptions配置介绍

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 从官方文档可见&#xff0c;一个vscode典型的task.json文件包含多种属性&#xff0c;格式复杂&#xff0c;任务可以分为全局任务和局部可选任务&#xff0c;在tasks.json一级配置的 任务为全局任务…

STM32-02-STM32基础知识

文章目录 STM32基础知识1. STM32F103系统架构2. STM32寻址范围3. 存储器映射4. 寄存器映射 STM32基础知识 1. STM32F103系统架构 STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片&#xff0c;而Cortex M内核使用的是ARM v7-M架构&#xff0c;是为了替代…

Tensorboard可视化远程服务器上保存的训练文件

方法一&#xff1a; 最简单的&#xff0c;把服务器上的训练权重文件下载到本地&#xff0c;使用本地的tensorboard打开 方法二&#xff1a; 使用VsCode的remote ssh插件&#xff0c;可以通过端口映射&#xff0c;将远程的6006端口映射到本地&#xff0c;直接访本地的6006即可…

【图论】普利姆算法,最小生成树

一次加入一个节点到我们的最下生成树中。加入哪个&#xff1f;跟着下面的步骤走一遍你就会了。 1. 把第一个节点A添加进来 2. 看两条边<A,B>,<A,E>,一个长度是3&#xff0c;一个长度是4&#xff0c;把长度短的边的另一个节点添加进来&#xff0c;也就是B 3. 再看A,…

多线程------ThreadLocal详解

目录 1. 什么是 ThreadLocal&#xff1f; 2. 如何使用 ThreadLocal&#xff1f; 3. ThreadLocal 的作用 4. ThreadLocal 的应用场景 5. ThreadLocal 的注意事项 我的其他博客 ThreadLocal 是 Java 中一个很有用的类&#xff0c;它提供了线程局部变量的支持。线程局部变量…

LangChain学习二:提示-实战(上半部分)

文章目录 上一节内容&#xff1a;LangChain学习一&#xff1a;模型-实战学习目标&#xff1a;提示词及提示词模板的运用学习内容一&#xff1a;什么是提示词&#xff1f;学习内容二&#xff1a;提示词模板2.1 入门2.2 模板格式2.3 验证模板2.4 序列化提示模板2.5 将少量示例传递…

从 AST 到代码生成:代码背后的秘密花园(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Selenium三大等待(详解版)

一、强制等待 1.设置完等待后不管有没有找到元素&#xff0c;都会执行等待&#xff0c;等待结束后才会执行下一步 2.实例&#xff1a; driver webdriver.Chrome()driver.get("https://www.baidu.com")time.sleep(3) # 设置强制等待driver.quit() 二、隐性等待 …

vscode 环境配置

必备插件 配置调试 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","confi…

华为OD试题六(数据最节约的备份方法、TLV解码)

1. 数据最节约的备份方法 题目描述&#xff1a; 有若干个文件&#xff0c;使用刻录光盘的方式进行备份&#xff0c;假设每张光盘的容量是500MB&#xff0c;求 使用光盘最少的文件分布方式 所有文件的大小都是整数的MB&#xff0c;且不超过500MB&#xff1b;文件不能分割、分卷…

新版Spring Security6.2案例 - Authentication用户名密码

前言&#xff1a; 前面有翻译了新版Spring Security6.2架构&#xff0c;包括总体架构&#xff0c;Authentication和Authorization&#xff0c;感兴趣可以直接点链接&#xff0c;这篇翻译官网给出的关于Authentication的Username/Password这页。 首先呢&#xff0c;官网就直接…

[Linux] LAMP架构

一、LAMP架构架构的概述 LAMP 架构是一种流行的 Web 应用程序架构&#xff0c;它的名称是由四个主要组件的首字母组成的&#xff1a; Linux&#xff08;操作系统&#xff09;&#xff1a; 作为操作系统&#xff0c;Linux 提供了服务器的基础。它负责处理硬件资源、文件系统管理…