c++ 深度优先搜索算法

本文介绍了一个使用深度优先搜索解决的分书问题。问题涉及为五位同学分配他们偏好的书籍,确保每位同学都能得到心仪的书籍。通过C++实现的程序能够找出所有可能的分配方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度优先搜索

有A、B、C、D、E 5本书,要分给张、王、刘、赵、钱5位同学,每人只能选1本。每个人都将自己喜爱的书填写在下表中。请你设计一个程序,打印出让每个人都满意的所有分书方案。

134117_rSkg_1474656.png

#######################################################

yuanzhen@ubuntu:~/C_script$ cat dfs_one.cpp 
#include <iostream>
#include <vector>
#include <cstdlib>
#include <set>

using std::cout;
using std::endl;
using std::vector;
using std::set;

typedef vector<vector<int> > VECTOR_VEC_INT;

VECTOR_VEC_INT vec;
//VECTOR_VEC_INT book(5,vector<int>(5,0));
vector<int> book(5,0);
vector<int> person(5,0);
set<vector<int> > pset;

void show(VECTOR_VEC_INT avec)
{
    VECTOR_VEC_INT::const_iterator cit;
    vector<int>::const_iterator it;

    for(cit=avec.begin(); cit!=avec.end();++cit)
    {
        vector<int> bvec=(*cit);
        for(it=bvec.begin();it!=bvec.end();++it)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
}

VECTOR_VEC_INT init()
{
    VECTOR_VEC_INT avec(5,vector<int>(5,0));
    //show(avec);
    avec[0][2]=1;
    avec[0][3]=1;
    avec[1][0]=1;
    avec[1][1]=1;
    avec[1][4]=1;
    avec[2][1]=1;
    avec[2][2]=1;
    avec[3][3]=1;
    avec[4][1]=1;
    avec[4][4]=1;
    return avec;
}

void show_book(vector<int> book, const char* bstr)
{
    cout << bstr << "\t";
    for(int i=0;i<book.size();++i)
      cout << book[i] << " ";
    cout << endl;
}

void dfs(int step)
{
    if(step==5)
    {
        set<vector<int> >::iterator it;
        it=pset.find(person);
        if(vec[0][person[0]]==1 && vec[1][person[1]]==1 && vec[2][person[2]]==1 && vec[3][person[3]]==1 && vec[4][person[4]]==1 && it==pset.end())
        {
            pset.insert(person);
            for(int i=0;i<person.size();++i)
              cout << person[i] << " ";
            cout << endl;
            cout << "..............."<< endl;
            return ;
        }
    }
    else
    {

   for(int p=0;p<5;p++)
   {
       for(int b=0;b<5;b++)
       {
           if(vec[p][b]==1 && book[b]==0 && person[p]==0)
           {
               book[b]=1;
               person[p]=b;
               //cout << step << "\t";
               //show_book(person,"person1");
               dfs(step+1);
               book[b]=0;
               person[p]=0;
               //cout << step << "\t";
               //show_book(person,"person2");
           }
       }
   }
}
}

int main(int argc, char** argv)
{
    vec=init();
    show(vec);
    cout << "-----------------------" << endl;
    dfs(1);


}

################################################

在代码中,使用了set,因为若不是set 就会出现 重复输出的情况,清楚原因。希望有知道的大侠予以指正
 

转载于:https://my.oschina.net/lCQ3FC3/blog/822842

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值