中级农民
- 积分
- 114
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-12-26
- 最后登录
- 1970-1-1
|
- import java.util.*;
- public class Test {
- public static void main(String[] args){
- Solution s = new Solution();
- int[][] map = s.randomIslands();
- for(int i = 0; i < 8; i++) {
- for(int j = 0; j < 8; j++) {
- System.out.print(map[i][j] + " ");
- }
- System.out.println();
- }
- }
- }
- class Solution {
- Random rand = new Random();
- int[][] map = new int[8][8];
- public int[][] randomIslands() {
- Stack<int[]>[] stacks = new Stack[4];
- for(int i = 0; i < 4; i++)
- stacks[i] = new Stack<>();
- int[][] starts = new int[4][2];
- //generate four start points
- generateStarts(starts, stacks);
- while(true) {
- for(int i = 0; i < 4; i++) {
- if(stacks[i].size() < 16) {
- int[] start = stacks[i].peek();
- // if no exist way, keep pop the stack
- while (existWay(start) == null && !stacks[i].isEmpty())
- start = stacks[i].pop();
- //if stack is empty and no valid way, the start points is invalid, regenerate the start points
- if (existWay(start) == null && stacks[i].isEmpty()) {
- for(int j = 0; j < 8; j++)
- Arrays.fill(map[j], 0);
- for(int j = 0; j < 4; j++)
- stacks[j] = new Stack<>();
- generateStarts(starts, stacks);
- break;
- }
- int[] newStart = existWay(start);
- map[newStart[0]][newStart[1]] = i + 1;
- stacks[i].add(newStart);
- }
- }
- if(stacks[0].size() == 16 && stacks[1].size() == 16 && stacks[2].size() == 16 && stacks[3].size() == 16)
- break;
- }
- return map;
- }
- private void generateStarts(int[][] starts, Stack<int[]>[] stacks) {
- for(int i = 0; i < 4; i++) {
- int x = rand.nextInt(8);
- int y = rand.nextInt(8);
- //insure there is no same start points
- while(map[x][y] != 0) {
- x = rand.nextInt(8);
- y = rand.nextInt(8);
- }
- //count the groups as 1, 2, 3, 4
- map[x][y] = i + 1;
- starts[i][0] = x;
- starts[i][1] = y;
- }
- //add the start points into stacks
- for(int i = 0; i < 4; i++) {
- stacks[i].add(starts[i]);
- }
- }
- private int[] existWay(int[] pts) {
- int[][] moves = new int[][] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
- ArrayList<int[]> arr = new ArrayList<>();
- for(int i = 0; i < 4; i++) {
- int x = pts[0] + moves[i][0];
- int y = pts[1] + moves[i][1];
- if(x >= 0 && x < 8 && y >= 0 && y < 8 && map[x][y] == 0)
- arr.add(new int[]{x, y});
- }
- if(arr.size() != 0) {
- return arr.get(rand.nextInt(arr.size()));
- }
- return null;
- }
- }
复制代码
这样应该好一点,之前所有【i】都被omit了,具体思路我都记不清了,好像就是暴力解的
补充内容 (2018-9-13 10:04):
曰,这个也忽略,什么鬼,所有【i】还是都被清除了
补充内容 (2018-9-13 10:06):
一刷新就好了???自己演了场戏,呵呵呵呵 |
|