您的位置:首页 > 其它

分书问题 暴力求解

2017-04-24 10:26 169 查看
分书问题

Time Limit: 1000 ms   Memory Limit: 256 MB

Total Submission: 43   Submission Accepted: 17

Judge By Case

Description

已知有n本书(从1~n编号)和n个人(从1~n编号),每个人都有一个自己喜爱的书的列表,现在请你编写一个程序,设计一种分书方案,使得每个人都能获得一本书,且这本书一定要在他的喜爱列表中。

Input

输入数据共若干行,第一行为一个正整数n(n <= 20),从第2行到第n+1行,每行有n个0或1组成,第k行表示编号为k-1的人对这n本书的喜好列表,0表示不喜欢,1表示喜欢。

Output

输出数据仅一个整数,表示符合条件的分配方案的总数。

Sample Input
OriginalTransformed
5
00110
11001
01100
00010
01001


Sample Output
OriginalTransformed
1


int countn=0;//定义全局变量,代表方案数

int xiai[22][22];

int book[22]={0};//记录n本书是否被分出去,0表示没分配,1表示已分配

void Try(int i,int n)//建立递归函数,i表示第i个人

{

    int j,k;//定义变量

    for(j=1; j<=n; j++)//循环开始

    {

        //cout<<xiai[i][j]<<endl<<book[j];

        if(xiai[i][j]==1 && book[j]==0)//如果i这个人喜欢j这本书,并且j书还没被分出去

        {

            book[j]=1;//记录j书已被分配

         //   cout<<n<<endl;

            if(i==n)//如果都分完了,就输出这种方案

            {

                countn++;//将方案数加1

              //  cout<<"1111";

            }

            else

            {

                Try(i+1,n);//如果还没分配完,就继续给下一个人分书

            }

            book[j]=0;//如果j书分不出去,就将j书记录改成没分配,回溯

        }

    }

}

int main()

{

    memset(xiai,0,sizeof(xiai));

    memset(book,0,sizeof(book));

    int n;

    cin>>n;

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

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

            scanf("%1d",&xiai[i][j]);

    countn=0;

    Try(1,n);

    cout<<countn<<endl;

    return 0;

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