分书问题 暴力求解
2017-04-24 10:26
169 查看
分书问题
Time Limit: 1000 ms Memory Limit: 256 MB
Total Submission: 43 Submission Accepted: 17
Judge By Case
Description
已知有n本书(从1~n编号)和n个人(从1~n编号),每个人都有一个自己喜爱的书的列表,现在请你编写一个程序,设计一种分书方案,使得每个人都能获得一本书,且这本书一定要在他的喜爱列表中。
Input
输入数据共若干行,第一行为一个正整数n(n <= 20),从第2行到第n+1行,每行有n个0或1组成,第k行表示编号为k-1的人对这n本书的喜好列表,0表示不喜欢,1表示喜欢。
Output
输出数据仅一个整数,表示符合条件的分配方案的总数。
Sample Input
Sample Output
int countn=0;//定义全局变量,代表方案数
int xiai[22][22];
int book[22]={0};//记录n本书是否被分出去,0表示没分配,1表示已分配
void Try(int i,int n)//建立递归函数,i表示第i个人
{
int j,k;//定义变量
for(j=1; j<=n; j++)//循环开始
{
//cout<<xiai[i][j]<<endl<<book[j];
if(xiai[i][j]==1 && book[j]==0)//如果i这个人喜欢j这本书,并且j书还没被分出去
{
book[j]=1;//记录j书已被分配
// cout<<n<<endl;
if(i==n)//如果都分完了,就输出这种方案
{
countn++;//将方案数加1
// cout<<"1111";
}
else
{
Try(i+1,n);//如果还没分配完,就继续给下一个人分书
}
book[j]=0;//如果j书分不出去,就将j书记录改成没分配,回溯
}
}
}
int main()
{
memset(xiai,0,sizeof(xiai));
memset(book,0,sizeof(book));
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%1d",&xiai[i][j]);
countn=0;
Try(1,n);
cout<<countn<<endl;
return 0;
}
Time Limit: 1000 ms Memory Limit: 256 MB
Total Submission: 43 Submission Accepted: 17
Judge By Case
Description
已知有n本书(从1~n编号)和n个人(从1~n编号),每个人都有一个自己喜爱的书的列表,现在请你编写一个程序,设计一种分书方案,使得每个人都能获得一本书,且这本书一定要在他的喜爱列表中。
Input
输入数据共若干行,第一行为一个正整数n(n <= 20),从第2行到第n+1行,每行有n个0或1组成,第k行表示编号为k-1的人对这n本书的喜好列表,0表示不喜欢,1表示喜欢。
Output
输出数据仅一个整数,表示符合条件的分配方案的总数。
Sample Input
Original | Transformed |
5 00110 11001 01100 00010 01001
Sample Output
Original | Transformed |
1
int countn=0;//定义全局变量,代表方案数
int xiai[22][22];
int book[22]={0};//记录n本书是否被分出去,0表示没分配,1表示已分配
void Try(int i,int n)//建立递归函数,i表示第i个人
{
int j,k;//定义变量
for(j=1; j<=n; j++)//循环开始
{
//cout<<xiai[i][j]<<endl<<book[j];
if(xiai[i][j]==1 && book[j]==0)//如果i这个人喜欢j这本书,并且j书还没被分出去
{
book[j]=1;//记录j书已被分配
// cout<<n<<endl;
if(i==n)//如果都分完了,就输出这种方案
{
countn++;//将方案数加1
// cout<<"1111";
}
else
{
Try(i+1,n);//如果还没分配完,就继续给下一个人分书
}
book[j]=0;//如果j书分不出去,就将j书记录改成没分配,回溯
}
}
}
int main()
{
memset(xiai,0,sizeof(xiai));
memset(book,0,sizeof(book));
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%1d",&xiai[i][j]);
countn=0;
Try(1,n);
cout<<countn<<endl;
return 0;
}
相关文章推荐
- 鸡兔同笼问题java暴力求解算法
- 背包问题-暴力求解
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 八数码问题的暴力求解
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 暴力求解——POJ 1321 棋盘问题
- java求解蚂蚁爬杆问题(面向对象 暴力解法)
- leetcode 327. Count of Range Sum 字段和问题 + 动态规划DP解决 + 字段数 + 暴力求解真好
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 求解最大子数组问题 -- 暴力求解 和 分治法求解
- leetcode 149. Max Points on a Line 计算斜率的问题 + 直接暴力求解即可
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 最大子数组问题(一) 暴力求解
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)