更衣室问题普遍适用于n个人-重复错误

时间:2018-11-11 06:55:04

标签: java arrays multidimensional-array

我有以下代码:

import java.util.Scanner;
import java.util.Arrays;
public class Program11 {

  public static void main(String args[]) {
    Scanner input = new Scanner(System.in);
    System.out.print("Number of lockers:");
    int number = input.nextInt(); 
    System.out.print("Show stages [y/n]?");
    String show = input.next();
    if(show.equals("y")) 
    {
      for (char[] lockers : getStages(number)) 
      { 
        for (char c : lockers) 
        { 
          System.out.print("" + c); 
        } 
        System.out.println();
      }
    }
  }

  public static char[][] getStages(int n){      
    char[] lockers = new char[n];
    char[][] arrayLockers = new char[n][];
    for (int i = 0; i < n; i++) {
      lockers[i] = 'O';
    }
    for (int i = 0; i<1;i++){
      arrayLockers[i] = lockers;
    }
    for(int i = 2; i<=n; i++){
      for(int z = 1; z<n; z++){
        for (int w = i-1; w <= n; w += i){
          lockers[w] = 'X'; 
        }
        arrayLockers[z] = lockers;
      }

    }
    return arrayLockers;
  }
}

输出为n = 10:

> run Program11
Number of lockers: 10
Show stages [y/n]? y
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
OXXXXXXXXX
> 

更衣室问题如下: 有n个学生和n个储物柜。第一个学生打开所有储物柜。第二名学生关闭储物柜2,4,6,8,...。第三名学生关闭储物柜3,6,9,12,...这种模式会重复进行,直到所有n名学生都走了。

我的任务:

我应该显示给定n在每个阶段的储物柜。 “ X”表示关闭,“ O”表示打开。我应该只使用数组。显然,这是一次又一次地重复相同的数组,这是不正确的。我使用方法getStages返回一个多维数组“ arrayLockers”来存储每个阶段。 谁能告诉我我哪里出问题了?

预期输出为:

OOOOOOOOOO   
OXOXOXOXOX   
OXXXOXXXXX   
OXXXOXXXXX  
OXXXXXXXXX  
OXXXXXXXXX  
OXXXXXXXXX    
OXXXXXXXXX   
OXXXXXXXXX    
OXXXXXXXXX   

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。首先,您没有在复制前为arrayLockers分配内存。其次,您通过使用三个for循环(嵌套)来使逻辑复杂化。只需两个嵌套循环即可完成。另外,您正在使用数组分配,但我不确定它是否有效;因此,我使用了经常使用的System.arraycopy()进行了更改(或者您可以使用for循环手动进行更改)。

import java.util.*;
import java.lang.*;
import java.io.*;

class Program11 {

  public static void main(String args[]) {
    Scanner input = new Scanner(System.in);
    System.out.print("Number of lockers:\n");
    int number = input.nextInt(); 
    System.out.print("Show stages [y/n]?\n");
    String show = input.next();
    if(show.equals("y")) 
    {
      for (char[] lockers : getStages(number)) 
      { 
        for (char c : lockers) 
        { 
          System.out.print("" + c); 
        } 
        System.out.println();
      }
    }
  }

  public static char[][] getStages(int n){      
    char[] lockers = new char[n];
    char[][] arrayLockers = new char[n][];
    for (int i = 0; i < n; i++) {
      lockers[i] = 'O';
    }
    arrayLockers[0] = new char[lockers.length];
    System.arraycopy(lockers, 0, arrayLockers[0], 0, lockers.length);
    int cnt = 2;
    for (int i = 1; i < n; i++) {
        for (int j = i; j < n; j += cnt) {
            lockers[j] = 'X';
        }
        arrayLockers[i] = new char[lockers.length];
        System.arraycopy(lockers, 0, arrayLockers[i], 0, lockers.length);
        cnt++;
    }
    return arrayLockers;
  }
}