和尚挑水问题
2016-04-26 19:09
405 查看
前几天做了次笔试题,里面有条和尚挑水的问题,感觉对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;
}
}
}
题目:
某寺庙里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;
}
}
}
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- C 语言实现迷宫 DFS算法
- 一幅图弄清DFT与DTFT,DFS的关系
- HDFS---Namenode
- HDFS ---- Services startup
- POJ1523 SPF dfs
- poj1731 Orders dfs
- Surrounded Regions
- Binary Tree Zigzag Level Order Traversal,Restore IP Addresses,Word Search,Simplify Path
- DFS基础(1)
- HDU1241 Oil Deposits
- DFS算法有趣小题目
- HDU 1016 Prime Ring Problem