分书问题 559NEFUOJ

来源:互联网 发布:淘宝客服一直不回复 编辑:程序博客网 时间:2024/05/02 01:33

东林acm

description

有编号分别为1..n的n本书,准备分给n个人,每个人阅读兴趣用一个二维数组加以描述: 1:喜欢这本书0:不喜欢这本书Like[i][j] = 1 i 喜欢书jLike[i][j] = 0 i 不喜欢书j求解如何分书,让所有人都满意。

input

输入有多组数据,每组数据第一行,包含一个的正整数n.(0 < n <= 120).接下来n行每行n个数。

output

每组测试实例,输出一行,输出第i个分得的书的编号。每两个数据中间有个空格。(默认从做到右依次是第1个人,第2个人…第n个人。) 若有多个答案,输出序列数小的那组。如 2 3 1 5 4和1 5 4 3 2 则输出1 5 4 3 2。因为(15432<23154)

sample_input

20 11 1

sample_output

2 1
这个题我终于做出来了!!

     注意回溯,这是这道题的关键所在。网上有个类似题的讲解 人家讲的很好,我就不多说了,下面是我的代码……

#include <iostream>#include <cstdio>#include <string.h>using namespace std;int a[1005][1005],bol[1005],ab[1005];int p(int i,int n){    int j;    if(i==n+1)      return 1;    for(j=1;j<=n;j++)    {        if(a[i][j]==1&&bol[j]==0)        {            ab[i]=j;            bol[j]=1;            if(p(i+1,n))              return 1;            bol[j]=0;        }    }    return 0;}int main(){    int n,i,j;    while(~scanf("%d",&n))    {        memset(bol,0,sizeof(bol));        memset(ab,0,sizeof(ab));        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            scanf("%d",&a[i][j]);        i=1;        p(i,n);        for(i=1;i<=n;i++)           printf(i==n?"%d\n":"%d ",ab[i]);    }    return 0;}


0 0