博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1518 Square(Dfs)
阅读量:5243 次
发布时间:2019-06-14

本文共 1704 字,大约阅读时间需要 5 分钟。

题目:

 

题意:给你n条边,问你用光这些边能不能组成正方形

 

想到用深搜,但是怎么写出来挺难的。。。。。

 

这里主要是超时问题:其实对于某条边,对于那些用过的和不符合条件的for那里可以不扫。。。。。所以Dfs要增加一个参数index表示从那里开始扫。。。但是换另外一条边的时候index要改回0,因为那些未用的,对上一条边来说

不符合条件的,可能符合这条边的条件。。。。

 

代码:

#include 
using namespace std;const int M = 10000;int save[M];bool used[M];int sum;int l;int n;int flag;void Dfs(int now, int len, int index)//now:第几条边 len:该边现在组成的长度 index:用来优化时间{ if (now == 5) { flag = 1; return ; } if (len == l) { Dfs(now + 1, 0, 0); if (flag)//优化时间 { return ; } } for (int i = index; i < n; i++)//从index开始优化时间 { if (!used[i] && save[i] + len <= l) { used[i] = 1; Dfs(now, save[i] + len, i + 1); if (flag)//优化时间 { return; } used[i] = 0; } }}int main(){ int t; scanf("%d", &t); while (t--) { sum = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", save + i); sum += save[i]; } if (sum % 4 != 0)//简答的优化 { puts("no"); continue; } l = sum / 4; int i; for (i = 0; i < n; i++)//有比边长大的边就不行 { if (save[i] > l) { break; } } if (i != n) { puts("no"); continue; } memset(used, 0, sizeof(used)); flag = 0; Dfs(1, 0, 0); if (flag) { puts("yes"); } else { puts("no"); } } return 0;}

 

 

转载于:https://www.cnblogs.com/qiufeihai/archive/2012/09/02/2668044.html

你可能感兴趣的文章
如何添加字体
查看>>
正则1-9
查看>>
货币宽松结束
查看>>
波浪趋势
查看>>
Windows Live Writer测试
查看>>
Nginx开发从入门到精通
查看>>
Linux 最常用命令
查看>>
【转载】linux中误删除oracle数据文件的恢复操作
查看>>
关于@synchronized 比你想知道的还多
查看>>
全国三级联动
查看>>
一些常用到的大计量单位
查看>>
bzoj3591: 最长上升子序列
查看>>
2018-2019-2 20189206 《网络攻防实践》 第六周作业
查看>>
gulp相关
查看>>
Linux系统中的日志管理
查看>>
转换 PDF 格式为适合电纸书阅读的版本
查看>>
(转)据说是2010年迅雷笔试题
查看>>
一个很有意思的面试题
查看>>
Oracle数据库安装篇
查看>>
ubuntu14.04无法安装Curl,需要先升级sudo apt-get update
查看>>