Acwing 正方形数组的数目(dfs去重)

解题代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define rep(i,a,n) for(int i = a; i <= n; i++)
const int N = 20;
int a[N];
int n,ans;
int st[N];
int check(int x){
int y = sqrt(x);
return y * y == x;
}
void dfs(int u, int last){
if(u == n){
ans++;
}else{
rep(i,0,n-1){
if(st[i])continue;//如果这个数已经被搜过了,就代表不用搜了
if(i && !st[i - 1] && a[i] == a[i - 1])continue;
//首先比第一个数大,
//然后处于递归的同一层,前一个肯定已经恢复现场了,
//最后判断是否和前一个相等.
if(!check(a[i] + last)) continue;//不满足条件
st[i] = 1;
dfs(u + 1,a[i]);
st[i] = 0;
}
}
}
int main(){
cin >> n;
rep(i,0,n - 1){
cin >> a[i];
}
sort(a,a + n);
rep(i,0,n -1){
if(!i|| a[i] != a[i - 1]){
st[i] = 1;
dfs(1,a[i]);//因为我们这里已经自己选择了一个数作为第一个元素,所以这里的1代表第二层
//所以递归的出口就是 u == n
st[i] = 0;
}
}
cout << ans << endl;
return 0;
}
dfs去重输出
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define rep(i,a,n) for(int i = a; i <= n; i++)
const int N = 20;
int a[N];
int n,ans;
int st[N];
int path[N];
void dfs(int u, int last){
if(u == n){
rep(i,0,n-1) cout<<path[i]<<" ";
puts("");
}else{
rep(i,0,n-1){
if(st[i])continue;
if(i && !st[i - 1] && a[i] == a[i - 1])continue;
st[i] = 1;
path[u] = a[i];
dfs(u + 1,a[i]);
st[i] = 0;
}
}
}
int main(){
cin >> n;
rep(i,0,n - 1) cin >> a[i];
sort(a,a + n);
rep(i,0,n -1){
if(!i|| a[i] != a[i - 1]){
st[i] = 1;
path[0] = a[i];
dfs(1,a[i]);
st[i] = 0;
}
}
return 0;
}
结果参考

Acwing 正方形数组的数目(dfs去重)的更多相关文章
- [Swift]LeetCode996. 正方形数组的数目 | Number of Squareful Arrays
Given an array A of non-negative integers, the array is squareful if for every pair of adjacent elem ...
- php二维数组根据某个字段去重
php的二维数组根据某个字段去重,在这默认为二维数组的结构是一样的,现在根据二维数组里的id字段去重,把id相同的重复的元素去掉 /** * 二维数组根据某个字段去重 * @param array $ ...
- java对一个int数组进行排序、去重
思路: 1.使用 HashSet 进行去重 2.将 HashSet 变为 TreeSet 3.使用 TreeSet 进行排序 4.将 Set 变为 Integer 数组 5.将 Integer 数组变 ...
- poj 1564 Sum It Up (DFS+ 去重+排序)
http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...
- AcWing 228. 异或 (dfs+线性基)打卡
题目:https://www.acwing.com/problem/content/230/ 题意:有一个图,每条边有一个权值,现在求1-n的一条路径的最大异或和,一条边能经过多次,相应的也要计算那么 ...
- hdu 1258 Sum It Up(dfs+去重)
题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...
- JS 中数组的排序和去重
在 PHP 中,数组有很多排序方法,不过其他语言的数组中大概是不会像 JS 的数组一样,包罗万象,啥都通吃的.所以 JS 的数组排序情况就略多一些了. 简单粗暴的排序: 赤果果的sort: var ...
- 线性时间常数空间找到数组中数目超过n/5的所有元素
问题描述: Design an algorithm that, given a list of n elements in an array, finds all the elements that ...
- poj 1564 Sum It Up【dfs+去重】
Sum It Up Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6682 Accepted: 3475 Descrip ...
随机推荐
- 如何手写一个js工具库?同时发布到npm上
自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...
- 机器学习-Kmeans
一.什么是聚类算法? 1.用于发现共同的群体(cluster),比如:邮件聚类.用户聚类.图片边缘. 2.聚类唯一会使用到的信息是:样本与样本之间的相似度(跟距离负相关) 给定N个训练样本(未标记的) ...
- 丽泽普及2022交流赛day19 半社论
目录 No Problem Str Not TSP 题面 题解 代码 Game 题面 题解 代码 No Problem 暴力 Str 存在循环节,大力找出来即可,长度显然不超过 \(10^3\) . ...
- ZJOI2016 小星星 题解
我一生之敌是状压 本文发表于 洛谷博客:https://www.luogu.com.cn/blog/LoveMC/solution-p3349 Cnblogs:https://www.cnblogs. ...
- 2511-Druid监控功能的深入使用与配置-如何记录监控数据(基于logback)
Druid的监控很强大,但可惜的是监控数据是存在内存中的,需求就是定时把监控数据记录下来,以日志文件的形式或者数据库入库. 记录两种方式: 数据库入库 logback形式记录 原理(重点) 如果仅仅想 ...
- 配置Webpack Dev Server 实战操作方法步骤
本文摘要:配置 Webpack Dev Server 可以解决本地开发前端应用时,手动执行 webpack 命令或 yarn build 命令,再去浏览器中访问 dist/index.html 的麻烦 ...
- Vue 样式绑定 && 条件渲染
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...
- Odoo14 ir.config_parameter 系统参数
1 # 文件上传大小限制 2 web.max_file_upload_size = 128 * 1024 * 1024 # 128m 3 # 以上是odoo中设置上传文件的最大size,但如果你用了n ...
- linux-0.11分析:init文件 main.c的第一个初始化函数mem_int 第四篇随笔
init文件夹 mian.c 参考 [github这个博主的 厉害][ https://github.com/sunym1993/flash-linux0.11-talk ] 首先先看看这个mian. ...
- AI识万物:从0搭建和部署手语识别系统 ⛵
作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 计算机视觉实战系列: https://www.showmeai.tech ...