分书问题的参考代码

 

这道题需要我们输出方案,即每个人分别领到了什么书,我们可以使用数组来代表每个人对于五本书的喜好情况。

鉴于数据量较大,如果一个一个遍历较为复杂,我们使用“回溯法”,即碰到一条路走不通,马上回头,选择下一条路。

#include<stdio.h>
#include<iostream>
using namespace std;
int take[5],n;//take[5]用于记录第i号人拿了第j本书
int like[5][5]={{0,0,1,1,0},{1,1,0,0,1},{0,1,1,0,1},{0,0,0,1,0},{0,1,0,0,1}};//使用二维数组记录每个人的喜爱情况;
int book[5]={0,0,0,0,0};//通过1和0来分别表示每本书有没有被拿取
void Try(int i);
void Try(int i)
{
int j,k;
for(j=0;j<5;j++){
    if((like[i][j]>0&&book[j]==0))     //如果第i号人喜爱j号书并且j号书还没被拿走,便可拿走
        {take[i]=j;
    book[j]=1;           //i号拿走j号书,j号书被拿走
    if(i==4)
    {
        n++;
        cout<<"第"<<n<<"个方案\n";
        for(k=0;k<=4;k++)
        {
            cout<<take[k]<<"号书分给"<<char(k+65)<<endl;
        }
        cout<<endl;
    }
    else
        Try(i+1);//若还有人没拿到书,接着调用本函数拿书
    take[i]=-1;//当函数调用全部完成,能够输出的方案输出完时,将拿的书退回,为j+1的情况做准备
    book[j]=0;
    }
    }
}


int main(){
    n=0;//预置方案数为0
    Try(0);//调用函数,让子弹飞一会儿
    return 0;}

参考代码如上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值