分书问题

递归实现分书问题

#include<iostream>
using namespace std;
int number;//方案数
int take[5];//限制条件,用户编号
bool assigned[5];//限制条件,代表书是否分出去,分出去为true,反之为false
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}};
void Try(int pos){
    int i;
    //中止条件
    if(pos==5){//此时意味着前4个人分配完成
        //方案数加一
        number++;
        //输出方案细节
        cout<<"第"<<number<<"个方案:";
        for(i=0;i<5;i++)
            cout<<take[i]<<' ';
        cout<<endl;
        return;
    }
    //为每一本书选择合适的人
    int book;
    for(book=0;book<5;book++){
        //查看是否满足条件
        if((like[pos][book]==1) && (assigned[book]==false)){
            //记录这本书的分配情况
            take[pos]=book;
            assigned[book]=true;
            //为下一位读者分配书
            Try(pos+1);
            //回溯
            assigned[book]=false;
        }
    }
}

int main(){
    number=0;//分书方案的初始值
    int book;
    //初始化限制条件
    for(book=0;book<5;book++){
        assigned[book]=false;//false表示没有分出去
    }
    //从第0个人开始分书
    Try(0);

return 0;}

我的微信公众号

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/79185034