2016华为暑期实习生编程题之和尚挑水

某寺庙里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);
 }

 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;
   }
  }
  
 }
}

输入:
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
输出:
2 6 3 1 4 5 7
5 6 3 1 4 2 7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值