排座位

来源:互联网 发布:js图片旋转样式 编辑:程序博客网 时间:2024/04/26 17:22
/*  排座位  要安排:3个A国人,3个B国人,3个C国人坐成一排。  要求不能使连续的3个人是同一个国籍。  求所有不同方案的总数?  *//*public class 排座位 {public static char[] c = {'A','A','A','B','B','B','C','C','C'}; public static int kinds= 0; // 不同方案总个数      // 检查是否有同一国人连续3个      public static boolean check(char[] c){          int count = 1;  // 初始个数          for(int i=0;i<c.length-1;i++){              if(c[i]==c[i+1]){                  count++;              }else{                  count = 1;  // 初始个数              }              if(count>=3) return true;          }          return false;      }      // 全排列      public static void f(char[] c,int start,int end){          if(start == end){              if(!check(c)){  // 检查是否有同一国人连续3个                  kinds++;      // 不同方案总个数加1              }              return ;          }else{              for(int i=start;i<=end;i++){                  char temp = c[i];                  c[i] = c[start];                  c[start] = temp;                  f(c,start+1,end); // 递归                  temp = c[i];                  c[i] = c[start];                  c[start] = temp;              }          }      }      public static void main(String[] args){          f(c,0,c.length-1);    // 全排列          System.out.println("kinds:"+kinds);      }  }*/方法二public class 排座位 {      public static int kinds=0;      public static int b[]=new int[9];      public static boolean vis[]=new boolean[9];     public static int a[]=new int[]{1,1,1,2,2,2,3,3,3};     static void dfs(int start,int end)      {          if(start==end)          {              kinds++;          }          else          {              for(int i=0;i<a.length;i++)              {                  if(!vis[i])//未上坐                  {                      b[start]=a[i];                      if(start>1 && b[start-2]==b[start-1] && b[start-1]==b[start])                           continue;//边排边检查提高效率                      vis[i]=true;                      dfs(start+1,end);                      vis[i]=false;                  }              }          }      }     public static void main(String[] args)      {            dfs(0,a.length);          System.out.println("kinds:"+kinds);      } }运行结果:kinds:283824扩展:如果每个国家的三个人是可重复的,即来自同一个国家的三个人是不区分的,所以序列是可以重复的。程序如下:import java.util.Arrays;  public class 排座位    {      static int kinds=0;      static int a[]=new int[4];      static int b[]=new int[4];      static int c[]=new int[4];      static int aim[]=new int[10];      public static void main(String[] args)      {          Arrays.fill(a,1);          Arrays.fill(b,2);          Arrays.fill(c,3);        dfs(1,3,3,3);          System.out.println("kinds:"+kinds);      }      static void dfs(int start,int a,int b,int c)      {          if(start==10)          {              kinds++;              for(int i=1;i<start;i++)              {                  System.out.printf("%c",(aim[i]+64));              }              System.out.println();          }          else if(start<3)//肯定不会出现三个座来自国家相同的,因为就两座位。         {              aim[start]=1;              a--;              dfs(start+1,a,b,c);              a++;                            aim[start]=2;              b--;              dfs(start+1,a,b,c);              b++;                            aim[start]=3;              c--;              dfs(start+1,a,b,c);              c++;          }          else          {              aim[start]=1;              if(!(aim[start-2]==aim[start-1] && aim[start-1]==aim[start]) && a>0)//不是3连号,且A国家还有人未上坐              {                  a--;                  dfs(start+1,a,b,c);                  a++;              }                            aim[start]=2;              if(!(aim[start-2]==aim[start-1] && aim[start-1]==aim[start]) && b>0)//同理              {                  b--;                  dfs(start+1,a,b,c);                  b++;              }                            aim[start]=3;              if(!(aim[start-2]==aim[start-1] && aim[start-1]==aim[start])  && c>0)//同理              {                  c--;                  dfs(start+1,a,b,c);                  c++;              }          }      }  }运行结果为(部分结果):CCBBAABCACCBBAACABCCBBAACBACCBBABAACCCBBABACACCBBABCAACCBBACAABCCBBACABACCBBACBAACCBBCAABACCBBCABAACCBCAABABCCBCAABBACCBCABAABCCBCABABACCBCABBAACCBCBAABACCBCBABAAkinds:1314

原创粉丝点击