pku 2362_Square 深搜+回溯

本文介绍了一个经典的四边拼接问题,并提供了一种基于深度优先搜索的解决方案。通过预处理输入数据并利用递归算法尝试每一种可能的组合方式来判断是否能够将给定的木棍长度组合成四个等长的部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搜索经典题,与pku acm_1011题类似。

写得有点拗手,一开始都不知道跳到哪里去了,还得参考了很久以前做的1011题的源码,还得多多练习啊~

详细代码:

Problem: 2362 User: moxiaomomo Memory: 240K Time: 110MS Language: C++ Result: Accepted #include <iostream> #include <algorithm> using namespace std; int n,m, s[25],sum; bool mark[25]; bool cmp(int a, int b){ return a > b; } bool DFS(int cur_len, int k, int cur_num){ if (cur_num == 4) return true; //4条边全部还原成功,返回true else if (cur_len == sum) return DFS(0, 0, cur_num + 1); //已完成当前一条边,还原下一条边 else{ int i;//pre,pre = 0, for (i = k; i < m; i++) { if (mark[i] && s[i] + cur_len <= sum){//当前木棍可用 //&& s[i] != pre //pre = s[i]; mark[i] = false; //改变使用状态 if (DFS(cur_len + s[i], i + 1, cur_num)) break; //递归检测下一条木棍 mark[i] = true; //如果使用当前的木棍并不能成功还原的话,还原此木棍状态 if (k == 0) return false; //回溯到第一根木棍仍然不能成功还原时,返回false } } if (i == m) return false; //一直到循环结束都无法还原边,则return false else return true; } } int main(){ cin>>n; while(--n>=0) { cin>>m; for (int i = sum = 0; i < m; i++) { cin>>s[i]; sum += s[i]; } if(sum%4!=0) {printf("no/n");continue;} sort(s, s + m, cmp); sum /= 4; memset(mark, true, sizeof(mark)); if(DFS(0, 0, 0))printf("yes/n"); else printf("no/n"); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值