【例题】CH0301 递归实现指数型枚举

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n;
vector<int> chosen;
void calc(int x) {
if (x==n+) {
for (int i=; i<chosen.size(); ++i)
printf("%d ", chosen[i]);
cout<<endl;
return;
}
calc(x+);
chosen.push_back(x);
calc(x+);
chosen.pop_back();
}
int main() {
cin>>n;
calc();
return ;
}

【例题】CH0302 递归实现组合型枚举

在前面的基础上加入以下代码即可:

if (chosen.size()>m||chosen.size()+(n-x+)<m)
return;
 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n, m;
vector<int> chosen;
void calc(int x) {
if (chosen.size()>m||chosen.size()+(n-x+)<m)
return;
if (x==n+) {
for (int i=; i<chosen.size(); ++i)
printf("%d ", chosen[i]);
cout<<endl;
return;
}
chosen.push_back(x);
calc(x+);
chosen.pop_back();
calc(x+);
}
int main() {
cin>>n>>m;
calc();
return ;
}

【例题】CH0303 递归实现排列型枚举

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n;
int order[];
int chosen[];
void calc(int k) {
if (k==n+) {
for (int i=; i<=n; ++i)
printf("%d ", order[i]);
puts("");
return;
}
for (int i=; i<=n; ++i) {
if (chosen[i]) continue;
order[k]=i;
chosen[i]=;
calc(k+);
order[k]=;
chosen[i]=;
}
}
int main() {
cin>>n;
calc();
return ;
}

【例题】费解的开关

容易发现3个性质:

1.每个位置最多点击一次

2.固定了第一行,满足题意的点击方案只有一种,如第i行已被固定,第i位为1,则第i+1行该位置需要被点击

3.点击先后顺序不影响最终结果

所以用位运算枚举第一行的点击方案,再递推出2~5行的点击,最后判断第5行是否满足题意即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int g[][];
char nex[][]={{,},{,-},{-,},{,},{,}}; void turn(int x, int y) {
for (int i=; i<; ++i) {
int tx=x+nex[i][];
int ty=y+nex[i][];
if (tx>&&tx<=&&ty>&&ty<=)
g[tx][ty]^=;
}
} void print() {
/*for (int i=1; i<=5; ++i) {
for (int j=1; j<=5; ++j)
printf("%1d", g[i][j]);
printf("\n");
}
puts("");*/
} int solve() {
int ans=0x3f3f3f3f;
for (int i=; i<; ++i) {
int flag=, tot=;
int tmp[][];
memcpy(tmp, g, sizeof(tmp));
for (int j=; j<; ++j)
if ((i>>j)&) //如果第j位为1,则第一排的第j位需要被按一下
{ turn(, j+); tot++; print();/*printf("a\n");*/}
for (int j=; j<; ++j) {
for (int k=; k<=; ++k)
if (g[j][k]==)
{ turn(j+, k); tot++; print();/*printf("b\n");*/}
}
for (int j=; j<=; ++j)
if (g[][j]==) flag=;
memcpy(g, tmp, sizeof(g));
if (flag) ans=min(ans, tot);
else continue;
}
if (ans>) return -;
return ans;
} int main() {
//freopen("1.txt", "w", stdout);
int T;
scanf("%d", &T);
while (T--) {
for (int i=; i<=; ++i)
for (int j=; j<=; ++j)
scanf("%1d", &g[i][j]);
printf("%d\n", solve());
}
return ;
}
/*
1
11101
11101
11110
11111
11111
*/

0x02 递推与递归的更多相关文章

  1. NOIP2013提高问题求解T2(关于递推与递归)

    同步发表于我的洛谷博客. NOIP2013提高问题求解2: 现有一只青蛙,初始时在n号荷叶上.当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,--,k号荷叶之一上,直到跳到第1号荷叶为止 ...

  2. 从一道NOI练习题说递推和递归

    一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...

  3. 【Luogu】【关卡2-12】递推与递归二分(2017年10月)

    任务说明:递推,层层递进,由基础推向顶层.二分不仅可以用来查找数据,还可以确定最合适的值. P1192 台阶问题 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶 ...

  4. 再谈循环&迭代&回溯&递归&递推这些基本概念

    循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...

  5. 「学习笔记」递推 & 递归

    引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) ...

  6. 题解报告:hdu 2084 数塔(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...

  7. (acwing蓝桥杯c++AB组)1.2 递推

    1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...

  8. 斐波那契数列 递归 尾递归 递推 C++实现

    ==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...

  9. 百练2755 奇妙的口袋 【深搜】or【动规】or【普通递归】or【递推】

    总Time Limit:  10000ms  Memory Limit:  65536kB 有一个奇妙的口袋.总的容积是40,用这个口袋能够变出一些物品,这些物品的整体积必须是40.John如今有n个 ...

随机推荐

  1. CentOS Linux 重启详解

    一.Linux 的五个重启命令 1.shutdown 2.poweroff 3.init 4.reboot 5.halt 二.五个重启命令的具体说明 shutdown reboot 在linux下一些 ...

  2. java基础类型源码解析之HashMap

    终于来到比较复杂的HashMap,由于内部的变量,内部类,方法都比较多,没法像ArrayList那样直接平铺开来说,因此准备从几个具体的角度来切入. 桶结构 HashMap的每个存储位置,又叫做一个桶 ...

  3. Oracle数据库常用脚本命令(二)

    --创建学生信息表create table student( sid number(8,0), name varchar2(20), sex char(2), birthday date, addre ...

  4. 使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S

    使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S 先行条件: 1.了解NetCore项目基础命令,如dotnet publish   等几个常用命令. 2.了解Dock ...

  5. 2. Django每日一码 之as_view() 源码

    2019-7-5  今日源码: as_view() CBV与FBV路由区别 urlpatterns = [ url(r'^publish/$', views.Publishs.as_view()), ...

  6. MYSQL千万级别数据量迁移Elasticsearch5.6.1实战

    从关系型库中迁移数据算是比较常见的场景,这里借助两个工具来完成本次的数据迁移,考虑到数据量并不大(不足两千万),未采用snapshot快照的形式进行. Elasticsearch-jdbc,Githu ...

  7. CDQZ集训DAY10 日记

    又一次跪了,跪在了神奇的数据范围上. T1上来打完暴力之后觉得是数据结构题,像三维偏序,于是开始往各种数据结构上想,主席树,线段树+calc,平衡树,树套树,CDQ……最终在经过一番思考之后选择去打C ...

  8. [POI2007]洪水pow 题解

    [POI2007]洪水pow 时间限制: 5 Sec  内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...

  9. BI之路学习笔记2--SSIS/ETL设计练习三:《DB->定期生成excel表》

    上次笔记记到,用sql任务给参数赋值,映射到变量,然后把数据流任务放到序列容器中进行执行,可以定期生成excel, 现在的问题是: 在EXCEL目标编辑过程中,必须选定某一个特定的excel目标,这样 ...

  10. nginx的access.log 和 error.log

    nginx 常用的配置文件有两种: access.log 和 error.log access.log 的作用是 记录用户所有的访问请求,不论状态码,包括200 ,404,500等请求,404,500 ...