[编程题] 工作安排

来源:互联网 发布:数据库无法连接 编辑:程序博客网 时间:2024/05/22 17:33

http://blog.csdn.net/gddxmmxf/article/details/68946131

时间限制:1秒

空间限制:32768K

现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作)。现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去。如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划。

输入描述:

输入数据有n+1行:
第一行为工程师人数n(1 ≤ n ≤ 6)
接下来的n行,每行一个字符串表示第i(1 ≤ i ≤ n)个人能够胜任的工作(字符串不一定等长的)

输出描述:

输出一个整数,表示有多少种不同的工作安排方案

输入例子1:

6
012345
012345
012345
012345
012345
012345

输出例子1:

720
 

package NeteaseSpring2017;

import java.util.Scanner;

//使用深度优先搜索查找可行方案

public class WorkArrangement{

      staticintcount;//方案数

      static intn;//工程师数

      static int[][]matrix;//横坐标为人,纵坐标为工作

      static int[]worked;//存储已分配出去的工作

      static String[]abilities;//工程师技能字符串

     

      public staticvoid dfs(inti)

      {

           if(i==n)//本轮分配结束

           {

                 count++;

                 return;

           }

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

           {

                 if(worked[j]==0&&matrix[i][j]==1)//工作j未分配出去且,且工程师i胜任j工作

                 {

                      worked[j]=1;//本轮将工作j分配出去

                      dfs(i+1);

                      worked[j]=0;//开始新一轮分配,清除工作j分配状态

                 }

           }

      }

      public staticvoid main(String[]args)

      {

           Scanner scan = newScanner(System.in);    

           while(scan.hasNext())//接受多组输入

         {

                 count=0;

                 n=Integer.parseInt(scan.nextLine());

                 abilities=new String[n];

                 worked=newint[6];

                 matrix=newint[n][6];

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

                 {

                      abilities[i]=scan.nextLine();

                      for(intj=0;j<abilities[i].length();j++)//工程师i的胜任工作字符串

                      {

                            matrix[i][abilities[i].charAt(j)-'0']=1;//根据输入初始化工作适应性矩阵,工程师i是否胜任j工作

                      }

                 }

                 dfs(0);

                 System.out.println(count);

         }

           scan.close();

      }

}

原创粉丝点击