首页 > 其他分享 >2024天梯赛【搜索】

2024天梯赛【搜索】

时间:2024-04-23 11:24:01浏览次数:15  
标签:abc return int dfs 2024 flag 搜索 天梯 题目

吉利矩阵

题目大意

image

dfs思路

  • 搜索策略:每一行每一行的搜索,(1,1)->(1,2)->...->(1,n)->(2,1)->...(n,n)
  • 剪枝策略:记录每一行与每一列的总和,sumRow,sumCol,接下来要填的数要小于等于 l - sumRow[x] 与 l - sumCol[y],如果当前行填完了,要判断当前行sumRow[x]是否等于 l。

题目代码

#include<bits/stdc++.h>
using namespace std;
int g[5][5],sumRow[5],sumCol[5];
int l,n,cnt;
void dfs(int x,int y){
    if(x == n + 1){
        ++cnt;return;
    }
    for(int i = 0;i <= min(l - sumRow[x],l - sumCol[y]);++i){
        sumRow[x] += i;sumCol[y] += i;
        if(y < n) dfs(x,y + 1);
        else if(y == n && sumRow[x] == l) dfs(x + 1,1);
        sumRow[x] -= i;sumCol[y] -= i;
    }
}
int main(){
    cin >> l >> n;
    dfs(1,1);
    cout << cnt << '\n';
}

类似题目

题目链接

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

题目代码1

#include<bits/stdc++.h>
using namespace std;

int n;string r,c;
vector<bool>lft(6,false),top(6,false);
vector<int>row(6,0),col(6,0);
vector<vector<char>>g(6,vector<char>(6,'.'));
bool flag = false;
void dfs(int x,int y){
	if(flag) return;
	if(x == n){
		for(int i = 0;i < n;++i) if(row[i] != 7) return;
		for(int j = 0;j < n;++j) if(col[j] != 7) return;
		cout << "Yes" << '\n';
		for(int i = 0;i < n;++i){
			for(int j = 0;j < n;++j){
				cout << g[i][j];
			}
			cout << '\n';
		}
		flag = true;
		return;
	}
	bool lleft = lft[x],ttop = top[y];
	for(int i = 0;i < 3;++i){
		char v = 'A' + i;
		if((row[x] >> i) & 1 || (col[y] >> i) & 1) continue;
		if(!ttop){
			if(c[y] != v) continue;
			else          top[y] = true;
		}
		if(!lleft){
			if(r[x] != v) {
				// 这里也要复原,不然就WA了,找了半天! 
				top[y] = ttop;
				continue;
			}
			else          lft[x] = true;
		}
		row[x] |= (1 << i);col[y] |= (1 << i);g[x][y] = v;
		if(y == n - 1){
			if(row[x] == 7) dfs(x + 1,0);
		}else dfs(x,y + 1);
		lft[x] = lleft;top[y] = ttop;
		row[x] ^= (1 << i);col[y] ^= (1 << i);g[x][y] = '.';
	}
	if(y == n - 1){
		if(row[x] == 7) dfs(x + 1,0);
	}else dfs(x,y + 1);
}
int main(){
	cin >> n >> r >> c;
	dfs(0,0);
	if(!flag) cout << "No\n";
	return 0;
}

题目代码2

#include<bits/stdc++.h>
using namespace std;

int n;string r,c;
vector<vector<string>>row(3);
vector<string>g;
bool flag;
void dfs(int i,int x){
	if(flag) return;
	if(i == n){
		if(x == 0){
			cout << "Yes\n";
			for(auto &nx:g) cout << nx << '\n';
			flag = true;
		}
		return;
	}
	for(auto &nx:row[r[i] - 'A']){
		g.push_back(nx);
		int tmp = x;
		bool flag1 = true;
		for(int j = 0;j < n;++j){
			if(nx[j] == '.') continue;
			int y = nx[j] - 'A';
			// y已经被选过了
			if((x & (1 << (4 * j + y))) == 0) {
				flag1 = false;break;
			}
			tmp ^= (1 << (4 * j + y));
			// 判断y是否是填的第一个数字,如果是的话,一定要等于c[j]!
			if((x & (1 << (4 * j + 3))) != 0){
				if(nx[j] != c[j]) {
					flag1 = false;break;
				}
				tmp ^= (1 << (4 * j + 3));
			}
 		}
 		if(flag1) dfs(i + 1,tmp);
 		g.pop_back();
	}
}
int main(){
	cin >> n >> r >> c;
	string abc = "ABC";
	while(abc.size() < n) abc.push_back('.');
	sort(abc.begin(),abc.end());
	do{
		char tmp;
		for(auto x:abc){
			if(x != '.'){
				tmp = x;break;
			}
		}
		row[tmp-'A'].push_back(abc);
	}while(next_permutation(abc.begin(),abc.end()));
	dfs(0,(1 << (4 * n)) - 1);
	if(!flag) cout << "No\n";
	return 0;
}

标签:abc,return,int,dfs,2024,flag,搜索,天梯,题目
From: https://www.cnblogs.com/gebeng/p/18152426

相关文章

  • Metasploit Pro 4.22.3-2024041701 (Linux, Windows) - 专业渗透测试框架
    MetasploitPro4.22.3-2024041701(Linux,Windows)-专业渗透测试框架Rapid7Penetrationtesting,ReleaseApr17,2024请访问原文链接:MetasploitPro4.22.3-2024041701(Linux,Windows)-专业渗透测试框架,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世......
  • 【2024-04-22】深夜食堂
    20:00对于绝大多数的人,人生本就是一堆责任而已。参透此谛,爱情是缘,友情是缘,亲情尤其是缘,不论怎样,皆当润砾成珠。                                                 ——梁......
  • 2024团体程序设计天梯赛——赛后总结
    2022年135分2023年164分感觉还是挺失望的,本来很稳的国三的就这样丢了,不过也是菜是原罪。一是对于读题的反思,L1-3,L1-4读题不认真导致直接白白被卡20分钟左右,还搞心态,后面的题目基本都没有一遍仔细地看完过。以后的题目尽量先把全部看一遍,然后再仔细看一遍题目部分(不看背景了),不......
  • 2024年4月22日最新版用13.2.0版的mingw64编译3.2.4版的wxwidgets
    相关文件下载链接:13.2.0版的MinGW643.2.4版的wxwidgets相关环境变量设置:右键单击“我的电脑”->属性->高级系统设置->环境变量->系统变量->Path->编辑->新建,输入解压后的mingw64中的bin路径。例如:D:\devolopment\mingw64\bin\测试成功安装与否,在上述环境变更设置好后......
  • 2024DASCTF
    DASCTFprese一眼控制了平坦化,可以用d810梭一下跟进一下main_crypto这个函数主要是两部分,第一部分是生成一个256大小的数组,通过输入的长度和遍历生成的一个数组第二部分就是主要的加密过程,那些杂七杂八的值完全可以不用看,其实就是一个找索引的题,然后猜一下输入的长度当时......
  • 20240422打卡
    第九周第一天第二天第三天第四天第五天第六天第七天所花时间9h代码量(行)727博客量(篇)1知识点了解完成了地铁查询系统的App......
  • 都2024年了,你还不知道git worktree么?
    三年前python大佬吉多·范罗苏姆(为Python程序设计语言的最初设计者及主要架构师)才知道gitworktree,我现在才知道,我觉得没啥丢人的。应用场景如果你正在feature的分支中开发新功能,线上版本紧急错误又需要你基于master做修复。可能有如下几种办法解决:解法1将本......
  • 2024激活Typora,最新版本的1.8.10.0可用
     原文https://blog.csdn.net/m0_58416529/article/details/136098186目前最新版本1.8.10.0也是可以实现激活的注:免修改注册表、不用修改时间,更不需要破解补丁01、下载&安装Typora从官网下载最新版本的Typora,并安装02、激活Typora找到Typora安装目录,依次找到这个文件r......
  • re-vctf2024-vm
    vctf2024-vm一.vctf2024vm题的题解,一直没有整理,是赛后看大佬wp才知道是upx魔改+rc4的。。二.解题思路1.去upx魔改:VCTF2024ezvm(虚拟机逆向初探)_vctfvm-CSDN博客[原创]UPX源码学习和简单修改-加壳脱壳-看雪-安全社区|安全招聘|kanxue.com加壳流程:(博客总结)a.写入文件的......
  • 云原生周刊:Kubernetes v1.30 发布 | 2024.4.22
    开源项目推荐pv-migratepv-migrate是一个CLI工具/kubectl插件,可轻松将一个Kubernetes的内容迁移PersistentVolumeClaim到另一个Kubernetes。ClaudieClaudie是一个云原生的Kubernetes管理平台,具备跨多个云提供商和本地数据中心的多云和混合云集群管理能力。它通过......