题目描述

已知有n本书(从1~n编号)和n个人(从1~n编号),每个人都有一个自己喜爱的书的列表,现在请你编写一个程序,设计一种分书方案,使得每个人都能获得一本书,且这本书一定要在他的喜爱列表中。

输入格式:

输入数据共若干行,第一行为一个正整数n(n <= 20)。
第2行到第n+1行,每行有n个0或1组成,第k行表示编号为k-1的人对这n本书的喜好列表,0表示不喜欢,1表示喜欢。

输出格式:

一行一个整数,表示符合条件的分配方案的总数。

输入样例

5
00110
11001
01100
00010
01001

输出样例

1

这道题想到的是递归,然后写了半天因为一个break没写导致浪费了很长的时间,我是用string类型的字符串做的,因为感觉这样会比循环数组会好一点。

#include<iostream>
using namespace std;
char every[21][21]; //用来存储输入的用户喜爱列表
int n,ans=0;   //ans是可成条件的总数
void dfs(int x,int y,string str){   //x,y为当前查找的二维数组坐标,str用来存储已经找到的切符合条件的情况int i=0;if(every[x][y]=='1'){ //如果该用户喜欢这本书的话,进行判断for(i=0;i<str.size();i++){  //循环str中的字符if(str[i]-'0'==y){   //如果化为整数后等于y则证明第y本书已经被分配,如果当前不是最后一本书则递归该用户的下一本书喜爱情况if(y<n-1){ dfs(x,y+1,str);break;}break;   //就是因为这个break,搞了半天,因为如果当前这本书已经被分配,那么直接跳出这个循环即可,不然代码会继续循环直至i=str.size(),会影响下面的代码,往下看。}}if(i==str.size()&&i<n){   //当i==str.size()时说明i运行到结尾了,即当前第y本书没有被分配,则进行如下递归char a;a = y+'0';    //将y转为字符if(y<n-1){   //如果没到末尾,先不选择该分配本书进行递归dfs(x,y+1,str);   }str=str+a;   //将当前分配的书的位置记录dfs(x+1,0,str);  //从下一行的第一本书进行递归}}else{  //当用户不喜欢这本书的情况,即every[x][y]==‘0’if(y<n-1){  //没有到末尾就往下一个即y+1递归dfs(x,y+1,str);}}if(x==n-1){  //如果到最后一行了if(str.size()==n){  //如果记录分配书的数量等于n则证明该分配规则成立ans++;   //结果加1return;}}}
main()
{cin>>n;string str;for(int i=0;i<n;i++){cin>>str;for(int j=0;j<str.size();j++){every[i][j]=str[j]; //存入char类型二维数组中}}dfs(0,0,""); //递归cout<<ans<<endl;}

我的方法可能比较乱,或者说是不好理解,看了一下跟网上其他的方法比还是有些乱,不过既然做出来了,那就记录一下,有问题请指教

分书问题(book)-C++相关推荐

  1. 数据结构与算法笔记:抽象思维之转换视角,提炼共性(分书和八皇后问题算法重构)

    转换视角,提炼共性 有时算法本身乍一看是不一样的,而且很不一样,比较结构特点,看不出来有什么共性 如果我们转换下看问题的视角,是否能够找到共性呢 1 ) 对比分书问题和八皇后问题 这两个问题,其实差异 ...

  2. 计算思维 by徐明星老师 逻辑推理、下楼、跳马、分书、八皇后、人鬼过河

    任务1.1 谁做的好事 A:不是我 B:是C C:是D D:他(C)胡说 四个人只有一个人做了好事. 三个人说真话,一个人说假话.请判断谁做了好事. 布尔代数(离散数学):将自然语言转换为机器语言(关 ...

  3. show部分书...

    继续购入中 转载于:https://www.cnblogs.com/Clingingboy/archive/2009/06/09/1499816.html

  4. 6本豆瓣高分书,国内外的技术大牛都在看!

    导读:今天,数据叔推荐的这6本书除了是豆瓣高分经典外,还跟一个小小的"商业机密"有关.最近,数据叔偶然发现一个Excel表格,里面列出了这些书的新版上市时间(今年下半年陆续)和新版 ...

  5. 学python推荐的10本豆瓣高分书单,小白到大佬,不看后悔一辈子

    一,Python编程初学者指南 本书一共12章,每一章都会用一个完整的游戏来演示其中的关键知识点,并通过编写好玩的小软件这种方式来学习编程,引发读者的兴趣,降低学习的难度.每章最后都会对该章的知识点进 ...

  6. 【数分书单】分析思维《一本小小的蓝色逻辑书》第一/二章小结

    <一本小小的蓝色逻辑书> by 布兰登.罗伊尔  第一章 感知和思维模式 很多人都会介意自己的记性不好,却很少有人在意自己的判断能力  -罗什富科公爵 1 选择性感知(法则一) 定义:指人 ...

  7. 【数分书单】分析思维《一本小小的蓝色逻辑书》第五章小结

    第五章 掌握逻辑 当你把所有不可能去掉之后,剩下的部分,无论看起来多么不可思议,都是真相. --夏洛克.福尔摩斯 "只要--就--" 陈述 "NSMA" 陈述 ...

  8. 【数分书单】分析思维《一本小小的蓝色逻辑书》第四章小结

     第四章 如何进行论述分析 学习一些基本的论述结构有助于提升我们的逻辑思维能力 1 什么是论述(法则20) 论据+关键假设=论点.关键假设的价值在于,它能把论据和论点联结起来 关键假设:作者或演讲者认 ...

  9. 【数分书单】分析思维《一本小小的蓝色逻辑书》第三章小结

     第三章 如何做决策 本章提到的决策工具主要包括"决策树"和"决策矩阵"两类.决策树可以让你的思考更有层次,决策矩阵则能帮你更好地对信息进行归纳和总结.加权分析 ...

最新文章

  1. Ampzz 2011 Cross Spider 计算几何
  2. Managing Tables
  3. VTK:vtkSeedWidget种子小部件用法实战
  4. 2019/Province_C_C++_A/D/迷宫
  5. 音视频技术开发周刊 93期
  6. qt动态添加窗口到垂直布局
  7. 【Python】单线程异步多线程多进程实例
  8. Spark:java.io.IOException: Connection reset by peer
  9. IDEA运行main,junit方法报错Class not found
  10. python post 上传文件_Python脚本POST上传数据以及文件
  11. 华擎主板bios设置图解_华擎主板bios设置图解 如何进入bios设置 BIOS设置图解教程...
  12. 2020年终系列:国内区块链专利授权总数不足3000项|链塔智库
  13. 什么是seo?seo是什么意思,如何理解?
  14. 正定矩阵、二次型与椭圆椭球
  15. 阿里巴巴实习一年之后的感悟
  16. 计算机无法进入bios按,BIOS无法进入实测解决教程
  17. 明日之后如何注销一个服务器的账号,明日之后账号怎么注销_明日之后账号注销方法介绍_玩游戏网...
  18. App运营推广过程中,比较实用的工具
  19. 腾讯云部署Hebe节点教程
  20. 安卓局域网外实现木马监听

热门文章

  1. NGS数据分析实践:05. 测序数据的基本质控 [1] - FastQC
  2. 民间借贷合同的违约金应约定多少
  3. strerror函数的总结【转】
  4. 免费公开微博小助手源代码---基于Autojs4的
  5. 华为交换机端口模式trunk⇌access互改
  6. jsp常见面试题及其知识点、EL、JSTL技术
  7. 双树复小波变换——详细分析
  8. CSS拾遗+技巧集合
  9. 25.0 httpd配置文件 chaos
  10. i.MX Yocto项目用户指南 -- 下