您的位置:首页 > 其它

分书问题,递归调用

2017-03-25 16:05 232 查看
/*

有编号分别为1..n的n本书,准备分

给n个人,每个人阅读兴趣用一个二

维数组加以描述:

 1:喜欢这本书

0:不喜欢这本书

Like[i][j] = 1 i 喜欢书j

Like[i][j] = 0 i 不喜欢书j

求解如何分书,让所有人都满意。

输入有多组数据,每组数据第一行,包含一个的正整数n.

(0 < n <= 120).

接下来n行每行n个数。

每组测试实例,输出一行,输出第i个分得的书的编号。每两个数据中间有个空格。

(默认从做到右依次是第1个人,第2个人…第n个人。) 若有多个答案,输出序列数小的那组。如 2 3 1 5 4和1 5 4 3 2 则输出1 5 4 3 2。因为(15432<23154)

*/

#include<iostream>

#include<string.h>

using namespace std;

const int N=125;

int map

;

bool vis
;

int ans
,n;

bool search(int m)

{

    if(m==n)                     //m=n,则n个人完成遍历,成功

        return true;

    for(int i=0;i<n;i++)

        if(!vis[i]&&map[m][i])     //vis[]的作用就是判断这本书有没有人选择,选择了就为1.

        {

            ans[m] = i+1;

            vis[i]=1;

            if(search(m+1))        //递归的地方,关键所在,如果本次的已经分配完成,那么开始下一个的选择。

                return true;

            vis[i] = 0;             //没有在上面返回,所以证明出错,在这里将i的vis重新赋值为0

        }

        return false;

}

int main()

{

    while(cin>>n)

    {

        memset(vis,0,sizeof(vis));

        memset(ans,0,sizeof(ans));

        for(int i=0;i<n;i++)

            for(int j=0;j<n;j++)

            cin>>map[i][j];

        if(search(0))

        {

            cout<<ans[0]<<endl;

            for(int i=1;i<n;i++)

                cout<<ans[i]<<endl;

        }else

        {

            cout<<"没有办法进行分配"<<endl;

        }

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: