某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五;
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7: 星期三,六,日;
请将所有合理的挑水时间组合
思路:自己只能想到穷举,可以采取一种回溯法穷举,利用一个矩阵存储,行表示星期,列表示和尚,和尚在哪一天有空则置为1
另外,用一个数组visited表示和尚是否挑过水,1表示挑过水,0表示没有。
这样,然后一行一行遍历,若是遇到矩阵值为1且visited为0,则将visited置为1并进行第二行遍历,依此递归进行,若
最后没有没有合适的组合,返回到上一步,visited置为原来的值0,继续进行
代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[][] matrix=new int[7][7];
for(int i=0;i<7;i++){
String line=sc.nextLine();
String[] array=line.split(" ");
for(int j=0;j<7;j++){
matrix[i][j]=Integer.parseInt(array[j]);
}
}
int[] visited=new int[7];
ArrayList<Integer> list=new ArrayList<>();
find(1,matrix,visited,list);
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[][] matrix=new int[7][7];
for(int i=0;i<7;i++){
String line=sc.nextLine();
String[] array=line.split(" ");
for(int j=0;j<7;j++){
matrix[i][j]=Integer.parseInt(array[j]);
}
}
int[] visited=new int[7];
ArrayList<Integer> list=new ArrayList<>();
find(1,matrix,visited,list);
}
private static void find(int i, int[][] matrix,int[] visited, ArrayList<Integer> list) {
if(i==8){
StringBuilder sb=new StringBuilder();
for(Integer current:list){
sb.append(current).append(" ");
}
System.out.println(sb.toString());
return;
}
for(int j=0;j<7;j++){
if(visited[j]==0&&matrix[i-1][j]==1){
visited[j]=1;
list.add(j+1);
find(i+1,matrix,visited,list);
list.remove(new Integer(j+1));
visited[j]=0;
}
}
}
}
if(i==8){
StringBuilder sb=new StringBuilder();
for(Integer current:list){
sb.append(current).append(" ");
}
System.out.println(sb.toString());
return;
}
for(int j=0;j<7;j++){
if(visited[j]==0&&matrix[i-1][j]==1){
visited[j]=1;
list.add(j+1);
find(i+1,matrix,visited,list);
list.remove(new Integer(j+1));
visited[j]=0;
}
}
}
}
输入:
0 1 0 0 1 0 0
1 0 0 0 0 1 0
0 0 1 0 0 0 0
1 0 0 0 1 0 0
0 0 0 1 0 1 1
0 1 0 0 1 0 0
0 0 1 0 0 0 1
1 0 0 0 0 1 0
0 0 1 0 0 0 0
1 0 0 0 1 0 0
0 0 0 1 0 1 1
0 1 0 0 1 0 0
0 0 1 0 0 0 1
输出:
2 6 3 1 4 5 7
5 6 3 1 4 2 7
5 6 3 1 4 2 7