和尚挑水问题

前几天做了次笔试题,里面有条和尚挑水的问题,感觉对DFS的理解很有帮助。

题目:

某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,例如:各人将有空天数列出如下表
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五;
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7: 星期三,六,日;

此时的输入就是 

0 1 0 1 0 0 0

1 0 0 0 0 1 0

0 0 1 0 0 0 1

0 0 0 0 1 0 0

1 0 0 1 0 1 0

0 1 0 0 1 0 0

0 0 1 0 0 1 0

请将所有合理的挑水时间安排表 

思路:利用DFS将每种方案都列出来,如果安排到某一天的时候发现没有和尚有空,就立刻返回寻找其他方案。

代码如下:

import java.util.*;

public class Main {

 

publicstatic void main(String[] args) {

//TODO Auto-generated method stub

Scannersc = new Scanner(System.in);

int[][]in = new int[7][7];

for(inti = 0;i < 7;i++){

for(intj = 0;j < 7;j++){

in[i][j]= sc.nextInt();

}

}

 

ArrayList<ArrayList<Integer>>res = new ArrayList<ArrayList<Integer>>();

ArrayList<Integer>occupy = new ArrayList<Integer>();

 

dfs(res,in,occupy,0);

System.out.println(res.size());

for(inti = 0;i < res.size();i++){

System.out.println((res.get(i).get(0)+1)+""+(res.get(i).get(1)+1)+" "+

(res.get(i).get(2)+1)+""+(res.get(i).get(3)+1)+" "+

(res.get(i).get(4)+1)+""+(res.get(i).get(5)+1)+" "+

(res.get(i).get(6)+1));

}

//return;

 

 

}

publicstatic void dfs(ArrayList<ArrayList<Integer>> res,int[][]in,ArrayList<Integer> occupy,int day){

System.out.println("day is "+day);

 

if(day==6){

for(inti = 0;i < 7;i++){

if(in[i][day]==1){

if(!occupy.contains(i)){

occupy.add(i);

ArrayList<Integer>tmp = new ArrayList<Integer>(occupy);

//tmp.add(i);

res.add(tmp);

//System.out.println(res.size());

//dfs(res,in,occupy,day+1);

occupy.remove(occupy.size()-1);//一定要记得去掉,不然只会出一个正确的可能

 

return;

}

}

}

return;

}else{

for(inti = 0;i < 7;i++){

if(in[i][day]==1){

if(!occupy.contains(i)){

//System.out.println("iis "+i+" day is "+day);

occupy.add(i);

dfs(res,in,occupy,day+1);

occupy.remove(occupy.size()-1);

}//如果不满足,千万不要return

}

}

return;

}

}

 

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值