当前位置: 代码迷 >> J2SE >> 算法-排议程 求解
  详细解决方案

算法-排议程 求解

热度:688   发布时间:2016-04-23 20:38:20.0
算法-排日程 求解
某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息2天。
    上级要求每个人每周的工作日和休息日安排必须是固定的,不能在周间变更。
    此外,由于工作需要,还有如下要求:
    1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。
    2. 一周中,至少有3天所有人都是上班的。
    3. 任何一天,必须保证 A B C D 中至少有2人上班。
    4. B D E 在周日那天必须休息。
    5. A E 周三必须上班。
    6. A C 一周中必须至少有4天能见面(即同时上班)。
    你的任务是:编写程序,列出ABCDE所有可能的一周排班情况。工作日记为1,休息日记为0
    A B C D E 每人占用1行记录,从星期一开始。
【输入、输出格式要求】
    程序没有输入,要求输出所有可能的方案。
    每个方案是7x5的矩阵。只有1和0组成。        
    矩阵中的列表示星期几,从星期一开始。
    矩阵的行分别表示A,B,C,D,E的作息时间表。
    多个矩阵间用空行分隔开。
    例如,如下的矩阵就是一个合格的解。请编程输出所有解(多个解的前后顺序不重要)。
0110111
1101110
0110111
1101110
1110110



我写的代码不知道哪里错了
求大神指导!!!
public class myt5 
{
static int[][]  num=new int[5][7];
static int a=0;
static int a1=0;
static int a2=0;
static int a3=0;
static int a4=0;
static int a5=0;
static int a6=0;
public static void main(String[] args) 
{
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num[i].length; j++) {
num[i][j]=0;
}
}
f(num,0,0);
System.out.println(a1+"+"+a2+"+"+a3+"+"+a4+"+"+a5+"+"+a6+"=="+(a1+a2+a3+a4+a5+a6));
System.out.println(a);
}
public static void f(int [][] n,int x,int y)//递归生成所有的可能性
{
int[][]  s=new int[5][7];
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s[i].length; j++) {
s[i][j]=n[i][j];
}
}
if(x>4&&y>6)
{
a++;
panduan(s);
return;
}
else if(x==4&&y==6)
{
f(s,x+1,y+1);
s[x][y]=1;
f(s,x+1,y+1);
}
else if(x==4)
{
f(s,x,y+1);
s[x][y]=1;
f(s,x,y+1);
}
else if(y==6)
{
f(s,x+1,y);
s[x][y]=1;
f(s,x+1,y);
}
else
{
f(s,x+1,y);
f(s,x,y+1);
f(s,x+1,y+1);
s[x][y]=1;
f(s,x+1,y);
f(s,x,y+1);
f(s,x+1,y+1);
}

}

public static void panduan(int[][] n) //判断是否满足条件
{

/*
  //1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。
     //2. 一周中,至少有3天所有人都是上班的。
     //3. 任何一天,必须保证 A B C D 中至少有2人上班。
     //4. B D E 在周日那天必须休息。
     //5. A E 周三必须上班。
     //6. A C 一周中必须至少有4天能见面(即同时上班)。
 */

//1. 所有人的连续工作日不能多于3天(注意:周日连到下周一也是连续)。
for (int i = 0; i < n.length; i++)
{
int start=0;
int end=0;
int count=0;
int temp=0;
boolean tem=true;
for (int j = 0; j < n[i].length; j++)
{
if(count>=3)
{
a1++;
return;
}
if(j==0)
{
count=1;
temp=n[i][j];
}
else
{
if(n[i][j]==temp)
{
count++;
}
else
{
count=1;
temp=n[i][j];
if(tem)
{
start=count;
tem=false;
}
}
}
if(j == n[i].length-1)
{
end=count;
}
}
if(start+end>=3)
{
a1++;
return;
}
}
//2. 一周中,至少有3天所有人都是上班的。
for (int i = 0; i < n[0].length; i++) 
{
int s=7;
for (int j = 0; j < n.length; j++) 
{
if(n[j][i]==0)
{
s--;
}
}
if(s<3)
{
a2++;
return;
}
}

     //3. 任何一天,必须保证 A B C D 中至少有2人上班。
for (int i = 0; i < n[0].length; i++) 
{
if(n[0][i]+n[1][i]+n[2][i]+n[3][i]<2)
{
a3++;
return;
}
}

     //4. B D E 在周日那天必须休息。

if(n[1][6]==1||n[3][6]==1||n[4][6]==1)
{
a4++;
return;
}
     //5. A E 周三必须上班。
if(n[0][2]==0||n[4][2]==0)
{
a5++;
return;
}
     //6. A C 一周中必须至少有4天能见面(即同时上班)。
int t=0;
for (int i = 0; i < n[0].length; i++) 
{
if(n[0][i]==1&&n[2][i]==1)
  相关解决方案