钓鱼
来源:互联网 发布:什么是微信公众号矩阵 编辑:程序博客网 时间:2024/04/27 17:05
- 钓鱼题
总共N个座位,三个门,每个门后面有M个人。进入的规则:门的顺序可以变,但是每个门打开后,门后的人必须全部进去才能开下一个门。每个人只能坐在离他最近的座位上,求人全部进入所走的最小步数
5 –test case
10 –总共的座位数
4 5 – 第一个门的位置是4,有5个人
6 2 – 第二个门的位置是6,有2个人
10 2 – 地三个门的位置是10,有2个人
10 – 下一组case
8 5
9 1
10 2
24
15 3
20 4
23 7
39
17 8
30 5
31 9
60
57 12
31 19
38 16
1 18
2 25
3 57
4 86
5 339
package com.daxiong.fish;import java.io.*;import java.util.*;public class Fish { static int[] data; static int sit; static int[] door; static int minSteps; static int[] orgin; static int[] allPer; static int[] used; public static void main(String[] args) throws Exception { Scanner sc = new Scanner(new File("src/case/fish.txt")); int door_one,door_sec,door_thr; int exit = sc.nextInt(); while ((exit--) != 0) { sit = sc.nextInt(); data = new int[sit + 10]; door = new int[sit + 10]; door_one = sc.nextInt(); door[door_one] = sc.nextInt(); door_sec = sc.nextInt(); door[door_sec] = sc.nextInt(); door_thr = sc.nextInt(); door[door_thr] = sc.nextInt(); minSteps = 1000; allPer = new int[100]; used = new int[3]; orgin = new int[3]; orgin[0] = door_one; orgin[1] = door_sec; orgin[2] = door_thr; allPer(0); System.out.println("....."); } } // 1 2 3 4 5 6 7 8 9 10 // 5 2 2 // 1 2 3 2 3 2 3 1 2 = static void bfs(int[] curData, int doorIndex, int curIndex, int num,int sumStep) { System.out.println(doorIndex + "," + sumStep); if (num == 0) { // 下一个门 if(door[curData[doorIndex+1]] > 0){ bfs(curData, doorIndex + 1, curIndex, door[curData[doorIndex+1]],sumStep); } if (doorIndex == 2) { // 3 个门 结束 minSteps = sumStep < minSteps ? sumStep : minSteps; } return; } int i = 0,j = 0,before = 0,after = 0; boolean isLeft = false,isRight = false; for (i = curData[doorIndex]; i > 0; i--) { // 遍历左边 if (data[i] != 1) { before = curData[doorIndex] - i; isLeft = true; break; } } for (j = curData[doorIndex]; j <= sit; j++) { // 右边 if (data[j] != 1) { after = j - curData[doorIndex]; isRight = true; break; } } // 如果左边或者右边没有了 if(!isLeft){ // 左边没有,放右边 data[j] = 1; bfs(curData, doorIndex, curIndex, num - 1,sumStep + after + 1); } if(!isRight){ // 右边没有了,放左边 data[i] = 1; bfs(curData, doorIndex, curIndex, num - 1,sumStep + before + 1); } if (after >= 0 && after <= sit && before >= 0 && before <= sit) { // 判断距离 if ((before == after)) { if (after == 0) { // 当前点 data[i] = 1; bfs(curData, doorIndex, curIndex, num - 1,sumStep + 1); } else { // 不同的两点 if(num-2 >= 0){ data[i] = data[j] = 1; bfs(curData, doorIndex, curIndex, num - 2,sumStep + before + after + 2); } else { data[i] = 1; // 先放左边 bfs(curData, doorIndex, curIndex, num - 1,sumStep + before + 1); } } } else if (before < after) { // 放到左边 data[i] = 1; bfs(curData, doorIndex, curIndex, num - 1,sumStep + before + 1); } else { // 右边 data[j] = 1; bfs(curData, doorIndex, curIndex, num - 1,sumStep + after + 1); } } } // 全排列 static void allPer(int index){ if(index == 3){ minSteps = 1000; for(int i = 0;i < (sit + 10);i++){ data[i] = 0; } bfs(allPer, 0, 0, door[allPer[0]],0); System.out.println(minSteps); return; } for(int i = 0;i < 3;i++){ if(used[i] != 1){ used[i] = 1; allPer[index] = orgin[i]; allPer(index+1); used[i] = 0; } } } static void print() { System.out.println("--------------"); for (int i = 1; i <= sit; i++) { System.out.print(data[i] + " "); } System.out.println(); System.out.println("--------------"); }}
阅读全文
0 0
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼
- 钓鱼记
- 钓鱼记
- 钓鱼记
- 钓鱼记
- 钓鱼记
- 钓鱼记
- 钓鱼记
- JavaWeb实现文件上传下载功能实例解析
- public/private/protected的具体区别
- Manacher算法
- 条款10:令operator=返回一个refereglce to this
- 去除map中键为偶数的元素
- 钓鱼
- 解决nginx: [error] open() "/usr/local/var/run/nginx.pid" failed错误
- poj Six Degrees of Cowvin Bacon
- js闭包
- 条款11:在operator=中处理“自我赋值
- Oracle PL/SQL开发基础(第二十八弹:使用锁定)
- #1 应用和实例
- 数据结构的重要概念总结
- 数据库中间件01-认识mycat