首页 > 其他分享 >D - ABC Puzzle -- ATCODER ABC 326

D - ABC Puzzle -- ATCODER ABC 326

时间:2023-11-08 21:33:54浏览次数:27  
标签:ATCODER ABC .. -- dfs int vector grid

D - ABC Puzzle

https://atcoder.jp/contests/abc326/tasks/abc326_d

Sample Input 1

Copy
5
ABCBC
ACAAB

Sample Output 1

Copy
Yes
AC..B
.BA.C
C.BA.
BA.C.
..CBA

思路

充分利用约束条件,构造算法,

避免穷举所有情况,然后再根据约束条件判断情况的合法性。

 

如下代码,优点:思路清晰,效率高。

 

首先,例如row首字母条件, 枚举每行可能得排列结果

例如 row = ABCBC

row1 可能值为

ABC..

.ABC.

..ABC

ACB..

.ACB..

..ACB

同理可得其它行的可能选项。

 

使用dfs遍历行的组合

dfs(0) : 没有一行确定

->

dfs(1): 第一行确定

->

dfs(2): 前两行确定

 ...

dfs(5): 前五行确定, 进行条件满足性判定, 如果满足,打印结果退出, 如果没有,则向上回溯, 继续遍历第五行的其它可选项。

 

Code

https://atcoder.jp/contests/abc326/submissions/47367840

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

bool cntCol(vector<string>& grid) {
    int n = grid.size();
    for(int j = 0; j < n; j++) {
        vector<int> cnt(3);
        for(int i = 0; i < n; i++) {
            ++cnt[grid[i][j] - 'A'];
        }
        if (cnt[0] != 1 ||  cnt[1] != 1 || cnt[2] != 1) return false;
    }
    return true;
}

bool dfs(vector<vector<string>>& configures, vector<string>& grid, string& row, string& col, int idx, vector<bool>& seen) {
    if (idx == row.size()) {
        if (cntCol(grid)) {
            cout << "Yes" << endl;
            for(string& val : grid) cout << val << endl;
            return true;
        }
        return false;
    }

    for(string& s : configures[row[idx] - 'A']) {
        bool flag = true;
        vector<bool> nxt = seen;
        for(int j = 0; j < col.size(); j++) {
            if (!nxt[j] && s[j] != '.') {
                if (s[j] == col[j]) nxt[j] = true;
                else {
                    flag = false;
                    break;
                }
            }
        }

        if (!flag) continue;
        grid.push_back(s);
        if (dfs(configures, grid, row, col, idx + 1, nxt)) return true;
        grid.pop_back();
    }

    return false;
}

void task() {
    int n;
    cin >> n;

    string r, c;
    cin >> r >> c;

    string s = "ABC";
    while(s.size() < n) s.push_back('.');
    sort(s.begin(), s.end());

    vector<vector<string>> configures(3);
    vector<bool> seen(n, false);
    vector<string> grid;
    do {
        for(char c : s) {
            if (c != '.') {
                configures[c - 'A'].push_back(s);
                break;
            }
        }
    } while(next_permutation(s.begin(), s.end()));

    if(!dfs(configures, grid, r, c, 0, seen)) cout << "No" << endl;
}

int main() {
    task();
    return 0;
}

 

标签:ATCODER,ABC,..,--,dfs,int,vector,grid
From: https://www.cnblogs.com/lightsong/p/17818353.html

相关文章

  • vue2+antd 使用select 通过v-model 无法回显也不能修改?
    <template><a-tablesize="middle":data-source="dataList":pagination="false":locale="{emptyText:'暂无数据'}":scroll="{x:'max-content'}"><a-table-columntitle=......
  • openEuler22.03操作系统 Linux内核Kernel 5.10 应该选择哪个版本的mysql安装包下载?
    对于openEuler22.03操作系统和Linux内核Kernel5.10,你应该选择与该操作系统和内核版本兼容的MySQL安装包进行安装。在确定适合的MySQL版本时,你可以考虑以下几点:MySQL官方支持:查看MySQL官方网站中的文档或支持页面,确认其是否支持openEuler22.03操作系统和Kernel5.......
  • 初识Django
    web框架web框架本质上可以看成是一个很强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端,两者通过网络请求实现数据交互,也可以从框架层面上先简单的将web框架看成是对前端、数据库的全方位整合web手敲框架步骤1.搭建socket服务端importsocketserver......
  • 关于 ts 中回调函数参数加上泛型限制后传入联合类型为什么会报错?
    相关代码如下,在use函数中加入联合类型后就会告诉我number和string类型不兼容,求教应该怎样解决这个问题,换个写法的话我想要的是保留use的泛型declarefunctionuse<T>(data:T,cb:(arg:T)=>void):voiddeclarefunctioncb1(arg:string):voiddeclarefunctioncb2......
  • springboot2 springboot 的引导类
    SpringBoot工程提供引导类用来启动程序,SpringBoot工程启动后创建并初始化Spring容器 packagecom.itheima;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context......
  • 求职的时候,哪些习惯帮助了你?
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!经过了一个秋招,相信大家感受到了习惯的力量。今天就来和学长一起看看,那些能帮助拿Offer的好习惯吧~01有时间观念在求职过程中,时间管理是非常重要的一环。首先,我们需要对自己......
  • DRF源码解析的文章简介
    DRF源码解析的文章简介DRF(DjangoRestFramework)是一个用于构建WebAPI的强大框架,它是基于Django框架的扩展,提供了丰厚的功用和易用的API。DRF的源码完成了许多常用的功用,例如序列化、认证、分页等。经过对DRF源码的深化解析,能够更好天文解和控制DRF的工作原理和完成细节,从而更好地......
  • 打印斐波那契数列的前 n 个数
    #include<stdio.h> intmain(){   intn=10;   intfirst=0,second=1,next;      printf("FibonacciSeries:%d,%d,",first,second);      for(inti=3;i<=n;i++){       next=first+second;       printf("%......
  • 有趣的Java之记录用户操作日志
    Java记录操作日志java自带的日志框架是java.util.logging(JUL),从JDK1.4(2002)开始捆绑在JDK中。可以使用JUL来记录操作日志。以下是使用JUL记录事务的示例://java.util.loggingjava.util.logging.Loggerlogger=java.util.logging.Logger.getLogger(this.getClass().getName());......
  • PowerShell 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth o
    问题描述创建PowerShellAzureDurableFunction,执行大量的PowerShell脚本操作AzureResource,遇见了一个非常非常奇怪的问题:Function'Hello1(Activity)'failedwithanerror.Reason:Newtonsoft.Json.JsonReaderException:Thereader'sMaxDepthof64hasbeenexceeded.Pa......