今日仍再熟悉dfs,对递归不够熟悉。希望通过dfs来加深对递归的理解。要理解递归,最好还是在纸上打草稿,不然进入递归和return很容易把自己绕晕。

例题:自然数的拆分问题https://www.luogu.com.cn/problem/P2404

题目描述

任何一个大于 11 的自然数 n,总可以拆分成若干个小于 n 的自然数之和。现在给你一个自然数 n,要求你求出 n 的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入格式

输入:待拆分的自然数 n。

输出格式

输出:若干数的加法式子。

输入输出样例

输入

7

输出

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

思路:这题实际上就是:给定一个n,然后输出所有加起来等于n的自然数。做这道题不能简单的从拆分入手,题目要求按照字典序的顺序输出。那么就从1开始,再到n。

当i=1时,ans第一个赋值为1,进入递归函数,直到进入最后一个的递归函数时,ans有7个1,输出。然后离开最后一个递归函数,回到倒数第2个递归,刚刚7个自然数和为n的情况已经输出完了,现在我们要来找6个自然数和为n的情况,在倒数第2个递归函数中,i=2,ans中第6个位置变为2,进入递归,判断和为n,输出。。。

上代码

#include<stdio.h>
int ans[10];void print(int t)
{for(int i=1;i<t-1;i++){printf("%d+",ans[i]);}printf("%d\n",ans[t-1]);
}
void dfs(int n,int t)//n为剩余的数,即ans[t]的后缀和
{if(n==0&&t>2)//ans的和达到了要求,可以输出{print(t);return;}for(int i=1;i<=n;i++)//从1开始{if(i>=ans[t-1])//确保序列中为升序 {ans[t]=i;dfs(n-i,t+1);//a[t]为i,那么它的后面的数的和只能是n-i     }}return;
}int main()
{int n;scanf("%d",&n);dfs(n,1);return 0;
}

在做这道题的时候,我进入了误区,单纯地把n拆分,一个数拆成俩个,两个变3。这一错误也可以靠dfs实现,与上面那道代码些许相似

//#include<stdio.h>
//int ans[10];
//
//void print(int t)
//{
//  for(int i=1;i<=t;i++)
//  {
//      printf("%d+",ans[i]);
//  }
//  printf("%d\n",ans[t+1]);
//}
//void dfs(int n,int t)
//{
//  if(n==1) return;
//  for(int i=1;i<=n/2;i++)//把一个数拆开,最多拆到一半左右
//  {
//      if(i>=ans[t-1])//确保升序
//      {
//          n=n-i;//拆分为n-i与i
//          ans[t]=i;
//          ans[t+1]=n;
//          print(t);
//          dfs(n,t+1);
//          n=n+i;
//      }
//  }
//  return;
//}
//
//int main()
//{
//  int n;
//  scanf("%d",&n);
//  dfs(n,1);
//  return 0;
//}

例题:填涂颜色https://www.luogu.com.cn/problem/P2404

题目描述

由数字 00 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1构成,围圈时只走上下左右 4个方向。现要求把闭合圈内的所有空间都填写成 2。例如:6×6 的方阵(n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数 n(1≤n≤30)。

接下来 n 行,由 0和 1   组成的 n×n 的方阵。

方阵内只有一个闭合圈,圈内至少有一个 00。

输出格式

已经填好数字 22 的完整方阵。

输入输出样例

输入 #1复制

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

输出 #1复制

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示

对于 100\%100% 的数据,1≤n≤30。

思路:这道题很简单,和迷宫十分相似,迷宫只要走到终点,这里就相当于把迷宫走完,把迷宫的每个地方都走一遍。把走过的地方全部变成2,最后在变回来就可以了。就不多赘述了。

#include<stdio.h>
int circle[32][32];
int n;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y)
{if(circle[x][y]==1){return;}int tx,ty;for(int i=0;i<4;i++){tx=x+dx[i];ty=y+dy[i];if(tx<=n+1&&tx>=0&&ty<=n+1&&ty>=0){if(circle[tx][ty]==0){circle[tx][ty]=2;                           dfs(tx,ty);}}}return;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&circle[i][j]);}}dfs(0,0);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(circle[i][j]==2){circle[i][j]=0;}else if(circle[i][j]==0){circle[i][j]=2;}printf("%d ",circle[i][j]);}printf("\n");}return 0;
}

每日总结2022.12.27相关推荐

  1. English Learning - Day21 作业打卡 2022.12.27 周二

    English Learning - Day21 作业打卡 2022.12.27 周二 引言 一.给出如下短语的汉语释义 1. vanished youth 2. faded flowers 3. o ...

  2. chrome浏览器抓包工具介绍(2022,12,27)

    1.elements 的作用 展示这个浏览器看到的这个网页的源代码.通过elements,比如要在这个网页爬虫,从源代码里面提取信息,要知道规则,在网页里面点击要提取的元素,源代码里面会蓝色底的显示出 ...

  3. AWVS安装与使用(最新版2022.12.27更新)

    AWVS安装与使用 1.AWVS 1.1.AWVS介绍 1.2.AWVS下载 2.AWVS安装 2.1.AWVS安装流程 2.1.1.运行安装 2.1.2.安装位置 2.1.3.设置账号密码 2.1. ...

  4. 2022.12.27号笔记 解决 npm run serve 项目起不来问题 解决 npm run serve 项目起不来问题

    1 解决 npm run serve 项目起不来问题 按快捷键 ctrl+` 即可打开终端子窗口,如下图所示 2 svn拉下的代码 是压缩好的如何处理 3.前端 项目如何在文件夹 中直接打开vscod ...

  5. 海康前端实习日记-2022.12月

    背景:框架是vue2,刚开始安排了一些缺陷单让你解决,后面就会分一些需求让你开发了.我是第一天装环境,第二天就开始解决缺陷了,第三周就开始开发需求啦 目录 2022.12.6 2022.12.7 20 ...

  6. 2022.12.5-12.11 AI行业周刊(第127期):一起做时间的朋友

    最近沸沸扬扬的就是核酸疫情的事情,突然之间,一下子全国都放开了,很不适应. 大宝在上幼儿园中班,上上个星期,学校的政策,还是没有核酸证明不得入校. 而上周末发的通知,已经是不得在外做核酸,只能到学校做 ...

  7. English Learning - Day3 作业打卡 2022.12.9 周五

    English Learning - Day3 作业打卡 2022.12.9 周五 引言 1. 这消息使她非常悲伤. 2. 他儿子要什么,他给什么. 3. 你能多给我一张票吗? 4. 事情不要做一半就 ...

  8. Hibiscus的脑机接口学习周报(2022/12/26~2022/1/1)

    2022/12/26(星期一) 在学习使用python mne库读取.set类型数据时,遇到了类似如下报错:buffer is too small (来源于Python读取.set格式的脑电数据出现b ...

  9. 【总结】包和模块(2022.4.27)

    [总结]包和模块(2022.4.27) 1.模块 1.1 模块是什么 python中一个py文件就是一个模块 1.2 如何在模块中使用另一个模块的内容 1)前提:被使用的模块的模块名(py文件的文件名 ...

最新文章

  1. 全差分放大器——共模的意义
  2. java 套接字 访问tcp_Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
  3. Java 拷贝,你能说出个 123 么?
  4. 解决Eclipse Pydev中import时报错:Unresolved import
  5. pytorch learning
  6. openDrive has Free Direct Linking !
  7. Ubuntu18.04 如何解决编译objective-c出现undefined reference to objc_get_class
  8. ASP类计算机专业毕业设计题目
  9. 微博音视频下载与合并
  10. 图论专题HDU-1869 六度分离
  11. C语言只用int这一种数据类型实现用拼音念数字
  12. 003-photoshop快速去掉图片背景颜色、签名放到指定文档合成图片
  13. openOCD的使用1: 应用openOCD和Jlink仿真器连接Freescale K60系列 MCU
  14. GPFS各类排故日志收集汇总
  15. HDU 1208 Pascal‘s Travels
  16. 移动应用市场爆炸性增长
  17. linux电脑滚轮不能用,鼠标滚轮不能用,小编教你电脑鼠标滚轮不能用怎么办
  18. ASP.NET编写简单的中文分词程序
  19. 计算式二级python_python实现自动生成小学四则运算题目(软工第二次项目作业)...
  20. 为什么总是标准正交基(标准直角坐标系)?

热门文章

  1. 处理器哪个好_a14处理器和骁龙865哪个好 a14处理器和骁龙865区别对比_CPU_硬件教程...
  2. Python字符与ASCII码的相互转换函数
  3. 中标麒麟系统安装 chrome浏览器记录
  4. javaScript读取页面表格中每个单元到EXCEL中
  5. android恢复出厂设置广播,如何恢复出厂设置您的Android TV | MOS86
  6. liunx7.9安装mysql8.0.29操作流程说明
  7. 大家都是怎么样去做销售的
  8. Altium designer 的放大镜打开和关闭
  9. 自定义view画走势图(一)
  10. 计蒜客-1884-奶牛晒衣服(priority_queue)