解题代码

#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去重)的更多相关文章

  1. [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 ...

  2. php二维数组根据某个字段去重

    php的二维数组根据某个字段去重,在这默认为二维数组的结构是一样的,现在根据二维数组里的id字段去重,把id相同的重复的元素去掉 /** * 二维数组根据某个字段去重 * @param array $ ...

  3. java对一个int数组进行排序、去重

    思路: 1.使用 HashSet 进行去重 2.将 HashSet 变为 TreeSet 3.使用 TreeSet 进行排序 4.将 Set 变为 Integer 数组 5.将 Integer 数组变 ...

  4. poj 1564 Sum It Up (DFS+ 去重+排序)

    http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...

  5. AcWing 228. 异或 (dfs+线性基)打卡

    题目:https://www.acwing.com/problem/content/230/ 题意:有一个图,每条边有一个权值,现在求1-n的一条路径的最大异或和,一条边能经过多次,相应的也要计算那么 ...

  6. hdu 1258 Sum It Up(dfs+去重)

    题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...

  7. JS 中数组的排序和去重

    在 PHP 中,数组有很多排序方法,不过其他语言的数组中大概是不会像 JS 的数组一样,包罗万象,啥都通吃的.所以 JS 的数组排序情况就略多一些了. 简单粗暴的排序: 赤果果的sort: var   ...

  8. 线性时间常数空间找到数组中数目超过n/5的所有元素

    问题描述: Design an algorithm that, given a list of n elements in an array, finds all the elements that ...

  9. poj 1564 Sum It Up【dfs+去重】

    Sum It Up Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6682   Accepted: 3475 Descrip ...

随机推荐

  1. ORM框架介绍——什么是ORM框架?

    1.什么是ORM?对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.ORM框架是连接数据库的桥梁,只要提供 ...

  2. EF Core 数据过滤

    1 前言 本文致力于将一种动态数据过滤的方案描述出来(基于 EF Core 官方的数据筛选器),实现自动注册,多个条件过滤,单条件禁用(实际上是参考ABP的源码),并尽量让代码保持 EF Core 的 ...

  3. CF222C Reducing Fractions

    题目大意: 给出两个集合,第一个集合数的乘积是分子,第二个集合的数的乘积是分母,要求够造一个同样的集合,但是得到的分数是最简分数. 分析: 寻找思路并不复杂,对两个集合的每个数进行质因数分解,然后统计 ...

  4. 网格动物UVA1602

    题目大意 输入n,w,h(1<=n<=10,1<=w,h<=n).求能放在w*h网格里的不同的n连块的个数(平移,旋转,翻转算一种) 首先,方法上有两个,一是打表,dfs构造连 ...

  5. 部署CDH集群环境准备

    一.系统centOS7以上,至少三台主机 添加ip 主机名映射关系:(每台主机都要做) vim /etc/hosts 127.0.0.1 localhost localhost.localdomain ...

  6. Scanner练习

    练习1 键盘输入两个数字求和 public static void main(String[] args) { Scanner in = new Scanner(System.in); System. ...

  7. 多线程与高并发(五)—— 源码解析 ReentrantLock

    一.前言 ReentrantLock 是基于 AQS 实现的同步框架,关于 AQS 的源码在 这篇文章 已经讲解过,ReentrantLock 的主要实现都依赖AQS,因此在阅读本文前应该先了解 AQ ...

  8. mysql中文乱码--存入mysql里的中文变成问号的解决办法

    今天,服务器里测试的时候,发现存入数据库的中文全部变成问号了! 首先想到这是编码问题:于是乎再次设置数据库的编码为utf8 可是,问题仍然存在: 后来发现,这个问题的根源应该是: 虽然数据库编码是ut ...

  9. SpingBoot解析Excel数据

    前言 在最近的工作中,由于导入模板除了前三列(姓名.手机号.实发工资)固定:其余的列不固定,并且可以做到两个模板的数据都能够正常入库进行对应业务处理. 一.数据模板数据展示: (1)模板一 (2)模板 ...

  10. Linux的NIS配置

    快速命令 # Server和Client设置NIS域名 nisdomainname nis_server echo 'NISDOMAIN=nis_server' >> /etc/sysco ...