首页 > 其他分享 >[ABC326D] ABC Puzzle 题解

[ABC326D] ABC Puzzle 题解

时间:2023-11-01 17:24:34浏览次数:30  
标签:满足条件 ABC int 题解 Puzzle num 字符串 个字符

题意:

给定整数 \(N\),字符串 \(R,C\),构造满足以下条件的 \(N\times N\) 矩阵:

1.每一行和每一列中 \(A,B,C\) 各有且仅有一个。

2.第 \(i\) 行的第一个字母等于字符串 \(R\) 的第 \(i\) 个字符。

3.第 \(i\) 列的第一个字母等于字符串 \(C\) 的第 \(i\) 个字符。

看数据范围考虑应该是搜索,首先先构造一个满足条件 1 的矩阵,然后再检查是否满足条件 2,3 即可。使用 \(dfs(line,num)\) 表示填到了第 \(line\) 行,第 \(num\) 个字符,逐行填入,每次填的时候判断一次是否满足条件 1,最后判断是否满足条件 2,3 即可。

上代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n, flag;
string s1, s2;
char c[10][10];
void print()
{
    cout << "Yes" << endl;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++)
            cout << c[i][j];
        cout << endl;
    }
    return;
}
bool judge(int x, int y, char z) {//判断第x行第y列能否填入字母z
    for (int i = 1; i < x; i++)
        if (c[i][y] == z) return false;
    if (c[x][y] != '.') return false;
    return true;
}
bool judge2() {
    char t;
    for (int i = 1; i <= n; i++) {//第i行第一个字母
        for (int j = 1; j <= n; j++)
            if (c[i][j] != '.') {
                t = c[i][j];
                break;
            }
        if (t != s1[i - 1]) return false;
    }
    for (int i = 1; i <= n; i++) {//第i列第一个字母
        for (int j = 1; j <= n; j++)
            if (c[j][i] != '.') {
                t = c[j][i];
                break;
            }
        if (t != s2[i - 1]) return false;
    }
    return true;
}
void dfs(int line, int num)//当前正在填入第line行,第num个字母
{
    if (flag) return;
    if (line == n + 1) {
        if (judge2()) {
            print();
            flag = 1;
        }
        return;
    }
    char now = 'A' + num - 1;
    for (int i = 1; i <= n; i++) {
        if (judge(line, i, now)) {
            c[line][i] = now;
            dfs(num == 3 ? line + 1 : line, num == 3 ? 1 : num + 1);
            c[line][i] = '.';
        }
    }
}
int main()
{
    cin >> n >> s1 >> s2;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            c[i][j] = '.';
    dfs(1, 1);
    if (!flag) cout << "No" << endl;
    return 0;
}

标签:满足条件,ABC,int,题解,Puzzle,num,字符串,个字符
From: https://www.cnblogs.com/nanbaoblog/p/17803607.html

相关文章

  • P4067 [SDOI2016] 储能表 题解
    [SDOI2016]储能表-洛谷题目详情-[SDOI2016]储能表-BZOJbyHydroOJ一道很好的数位dp题不过这题有一个比较有意思的性质:当\(n,m\)为\(2^k\)的形式时,最终得到的数组对每一行排序后为\(0\simm-1\)的排列,如果有的话说不定可以作为一个部分分?遇到二进制运......
  • 11月3号晚上测试题解
    3954ProblemA变量交换输出#include<stdio.h>intmain(){inta,b,c,x;scanf("%d%d%d",&a,&b,&c);//假设a,b,c分别为1,2,3;选择一个中间值进行数值替换x=a;//把a赋值给x,此时x就等于a的值为1a=c;//把c赋值给a,此时a就等于c的值为3c=b;//把b赋......
  • CF1874F Jellyfish and OEIS 题解
    题目链接不明白出题人的脑回路是不是被宇宙射线改变过/jy。题目给出了若干个区间,要我们计算满足每个区间都不是对应下标的排列的数量,正着计算不满足要求的数量是困难的,我们将其容斥,转化为钦定一些区间要求其必须满足它是对应下标的排列,在下文中,我们称这样的区间为一个约束。我......
  • spring注入bean错误-Bean named 'abc' is expected to be of type 'AAA' but was actu
    先看如下两个注入到spring容器中的bean,一个是UserNewManager,一个是UserManager。@ServicepublicclassUserNewManager{publicvoiddoSomething(){}}@ServicepublicclassUserManager{...}再看下面的testcase,利用@Resource注解来注入bean。@SpringB......
  • 题解 P6560 [SBCOI2020] 时光的流逝
    题解P6560[SBCOI2020]时光的流逝首先考虑图上的点为\(y\)终点时,或者这个点无法继续向下走,即\(du_i=0\)时,从这个点为起点先手必败,而对于每一个有一条指向先手必败的点的边的点,显然从这个点出发都是先手必胜的,以此类推。可以考虑建反图,进行拓扑排序,转移状态。#include<q......
  • 题解 [ARC149B] Two LIS Sum
    题解[ARC149B]TwoLISSum大胆猜结论,按照\(a\)数组为关键字进行排序,求更改后\(b\)的\(LIS\)。证明:每次移动,都有\(a\)中增加一个长度,\(b\)中贡献可能为\(\{-1,0,1\}\),总体贡献为\(\{0,1,2\}\),具体为:\(b\)中排序后大数变到小数前方。\(b\)中排序后小数仍然......
  • CF1872E Data Structures Fan 题解
    CF1872E翻译请把数据加强到\(\sumn\leq10^8\)后重新思考。我们维护全局中被标记的所有点的异或和。发现对于一次\(1\)操作,相当于让答案异或上区间的\(a_i\)异或和,因为这会让被标记的点变成没被标记的,而没被标记的点会产生贡献。查询的话直接查询即可复杂度......
  • P2391 白雪皑皑 题解
    一种很新的区间染色题目传送门题目大意有\(n\)个数初始都为\(0\),有\(m\)次操作,第\(i\)次将\((i\timesp+q)\bmodn+1\)与\((i\timesq+p)\bmodn+1\)之间数都改为\(i\),问\(m\)次操作后每个数分别是多少。其中\(1\len\le10^6,1\lem\le1......
  • AtCoder Beginner Contest(abc) 312
    B-TaKCode难度:⭐题目大意题目定义一种矩阵X:该矩阵的是一个长度为9的由黑白色块组成正方形矩阵;该矩阵的左上角和右下角都是一个3*3的黑色矩阵(总共18个),这两个黑色矩阵外面(边缘不算)包围一圈白色色块(总共14个);现在一个n*m的黑白矩阵,问这个大矩阵中有多少......
  • P4397聪明的燕姿 题解 & Miller~Rabin 质数判定
    涉及质数的时间复杂度都是玄学的。——题记传送门由整数唯一分解定理:\(\coprod\limits_{i=1}^{k}p_i^{c_i}\)有该正整数的正约数为:\(\coprod\limits_{i=1}^k(\sum\limits_{j=0}^{c_i}p_i^j)\)即我们要求有多少个数满足\(\coprod\limits_{i=1}^k(\sum\limits_{j=0}^{c_i}p_i^......