选书(深搜)

问题描述

n个同学分n本书,每个人都有自己喜欢的书(即a[i][j]==1),求出所有的分配方案

#include<iostream> 
#include<string>

using namespace std;

string name[25];//n个学生的名字 ,用于读入 
int c,n;//c记录可能的情况的个数,用于输出 
int flag[25],book[25],a[25][25];//flag记录第i本书是否被分,book记录第i个学生分到的书,a数组如题

void printx(){
    cout<<"answer"<<c<<":"<<endl;
    for (int i=1;i<n;i++){
        char ch=64+book[i]; 
        cout<<name[i]<<":"<<ch<<endl;
    }
}//输出第c种可能的情况 

void tried(int step){
    if (step==n+1){
        printx();
        return;
    }//所有人都分配过了就输出这种情况 
    for(int i=1;i<=n;i++){
        if(a[step][i]==1&&flag[i]==0){//第step个人对第i本书有兴趣,且第i本书没被分 
            flag[i]=1;
            book[step]=i;//记录
            tried(step+1);//递归
            flag[i]=0;
            book[step]=0;//回溯 
        }
    }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
      flag[i]=0;//初始化flag数组,要养成这个习惯
    for(int i=1;i<=n;i++)
      cin>>name[i];//输入学生姓名 
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        cin>>a[i][j];
    tried(1);//从第一个学生开始分书
    return 0; 
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,749评论 0 2
  • 这是我的梦境记录者。10.26 你的伴侣是和谁交换。每个爱人都是要交换。 七七又到了这个地方。入眼尽是绿色。是高大...
    张企鹅阅读 1,540评论 0 0
  • 我是日记星球278号星宝宝,我正在参加日记星球21天蜕变之旅,这是我的第11篇原创日记,希望大家喜欢。 ...
    彼岸8阅读 3,276评论 0 0
  • 文|小河对岸 最近的热播剧《虎啸龙吟》终於落下帷幕,该剧是一部以司马懿为视角的影视剧,而对司马懿也有很大程度上的美...
    173388a75016阅读 4,206评论 2 9