分书问题(book)-C++
题目描述
已知有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 ) 对比分书问题和八皇后问题 这两个问题,其实差异 ...
- 计算思维 by徐明星老师 逻辑推理、下楼、跳马、分书、八皇后、人鬼过河
任务1.1 谁做的好事 A:不是我 B:是C C:是D D:他(C)胡说 四个人只有一个人做了好事. 三个人说真话,一个人说假话.请判断谁做了好事. 布尔代数(离散数学):将自然语言转换为机器语言(关 ...
- show部分书...
继续购入中 转载于:https://www.cnblogs.com/Clingingboy/archive/2009/06/09/1499816.html
- 6本豆瓣高分书,国内外的技术大牛都在看!
导读:今天,数据叔推荐的这6本书除了是豆瓣高分经典外,还跟一个小小的"商业机密"有关.最近,数据叔偶然发现一个Excel表格,里面列出了这些书的新版上市时间(今年下半年陆续)和新版 ...
- 学python推荐的10本豆瓣高分书单,小白到大佬,不看后悔一辈子
一,Python编程初学者指南 本书一共12章,每一章都会用一个完整的游戏来演示其中的关键知识点,并通过编写好玩的小软件这种方式来学习编程,引发读者的兴趣,降低学习的难度.每章最后都会对该章的知识点进 ...
- 【数分书单】分析思维《一本小小的蓝色逻辑书》第一/二章小结
<一本小小的蓝色逻辑书> by 布兰登.罗伊尔 第一章 感知和思维模式 很多人都会介意自己的记性不好,却很少有人在意自己的判断能力 -罗什富科公爵 1 选择性感知(法则一) 定义:指人 ...
- 【数分书单】分析思维《一本小小的蓝色逻辑书》第五章小结
第五章 掌握逻辑 当你把所有不可能去掉之后,剩下的部分,无论看起来多么不可思议,都是真相. --夏洛克.福尔摩斯 "只要--就--" 陈述 "NSMA" 陈述 ...
- 【数分书单】分析思维《一本小小的蓝色逻辑书》第四章小结
第四章 如何进行论述分析 学习一些基本的论述结构有助于提升我们的逻辑思维能力 1 什么是论述(法则20) 论据+关键假设=论点.关键假设的价值在于,它能把论据和论点联结起来 关键假设:作者或演讲者认 ...
- 【数分书单】分析思维《一本小小的蓝色逻辑书》第三章小结
第三章 如何做决策 本章提到的决策工具主要包括"决策树"和"决策矩阵"两类.决策树可以让你的思考更有层次,决策矩阵则能帮你更好地对信息进行归纳和总结.加权分析 ...
最新文章
- Ampzz 2011 Cross Spider 计算几何
- Managing Tables
- VTK:vtkSeedWidget种子小部件用法实战
- 2019/Province_C_C++_A/D/迷宫
- 音视频技术开发周刊 93期
- qt动态添加窗口到垂直布局
- 【Python】单线程异步多线程多进程实例
- Spark:java.io.IOException: Connection reset by peer
- IDEA运行main,junit方法报错Class not found
- python post 上传文件_Python脚本POST上传数据以及文件
- 华擎主板bios设置图解_华擎主板bios设置图解 如何进入bios设置 BIOS设置图解教程...
- 2020年终系列:国内区块链专利授权总数不足3000项|链塔智库
- 什么是seo?seo是什么意思,如何理解?
- 正定矩阵、二次型与椭圆椭球
- 阿里巴巴实习一年之后的感悟
- 计算机无法进入bios按,BIOS无法进入实测解决教程
- 明日之后如何注销一个服务器的账号,明日之后账号怎么注销_明日之后账号注销方法介绍_玩游戏网...
- App运营推广过程中,比较实用的工具
- 腾讯云部署Hebe节点教程
- 安卓局域网外实现木马监听