我正在學習普林斯頓大學關于 cousera 的課程,我為以下問題撰寫了以下代碼:
掃雷艦。掃雷是 1960 年代的電子游戲,在 m×n 的單元格上玩。目標是使用有關相鄰單元格中地雷數量的線索來推斷哪些單元格包含隱藏的地雷。撰寫一個程式 Minesweeper.java,它接受三個整數命令列引數 m、n 和 k 并列印一個 m×n 網格,其中包含 k 個地雷,使用星號表示地雷,使用整數表示相鄰地雷計數(有兩個空格)每個單元格之間的字符)。為此,生成一個 m×n 單元格,其中 mn 個單元格中恰好 k 個包含地雷,均勻隨機。對于不包含地雷的每個單元格,計算相鄰地雷的數量(上方、下方、左側、右側或對角線)。
每次我提交給評分者;它說超過了 60 秒的限制,并停止評分。
這是所需的輸出

public class Minesweeper {
public static void main(String[] args) {
int m = Integer.parseInt(args[0]);
int n = Integer.parseInt(args[1]);
int k = Integer.parseInt(args[2]);
boolean[][] minePositions = new boolean[m 2][n 2];
int[][] grid = new int[m 2][n 2];
int num = 0;
while (num != k) {
if ((m * n) == k) {
for (int f = 1; f <= m; f ) {
for (int z = 1; z <= n; z ) {
minePositions[f][z] = true;
}
}
break;
}
int r = (int) (Math.random() * (m * n - 1));
int q = r / n;
int rem = r % n;
if (q == 0) {
q = 1;
}
else if (q > (m - 1)) {
q = m - 1;
}
if (rem == 0) {
rem = 1;
}
else if (rem > (n - 1)) {
rem = n - 1;
}
if (!minePositions[q][rem]) {
minePositions[q][rem] = true;
num ;
}
}
for (int i = 1; i <= m; i ) {
for (int j = 1; j <= n; j ) {
if (minePositions[i - 1][j 1]) grid[i][j] ;
if (minePositions[i][j 1]) grid[i][j] ;
if (minePositions[i 1][j 1]) grid[i][j] ;
if (minePositions[i - 1][j]) grid[i][j] ;
if (minePositions[i 1][j]) grid[i][j] ;
if (minePositions[i - 1][j - 1]) grid[i][j] ;
if (minePositions[i][j - 1]) grid[i][j] ;
if (minePositions[i 1][j - 1]) grid[i][j] ;
}
for (int j = 1; j <= n; j ) {
if (minePositions[i][j]) System.out.print("* ");
else System.out.print(grid[i][j] " ");
}
System.out.print("\n");
}
}
}
uj5u.com熱心網友回復:
I think using arrays of size (m 2, n 2) confused your math here. I'll continue on your work, always use m 2 and n 2 in your calculations to avoid any confusion.
int r = (int) (Math.random() * ((m 2) * (n 2)));
Generate a random number than can span all your array cells.
int q = r / (n 2);
int rem = r % (n 2);
// Increment num only if q and rem are in the ranges and the position does not have a mine on it
if (q > 0 && q <= m && rem > 0 && rem <= n && !minePositions[q][rem]) {
minePositions[q][rem] = true;
num ;
}
The full code
int m = Integer.parseInt(args[0]);
int n = Integer.parseInt(args[1]);
int k = Integer.parseInt(args[2]);
boolean[][] minePositions = new boolean[m 2][n 2];
int[][] grid = new int[m 2][n 2];
int num = 0;
while (num != k) {
int r = (int) (Math.random() * ((m 2) * (n 2)));
int q = r / (n 2);
int rem = r % (n 2);
if (q > 0 && q <= m && rem > 0 && rem <= n && !minePositions[q][rem]) {
minePositions[q][rem] = true;
num ;
}
}
for (int i = 1; i <= m; i ) {
for (int j = 1; j <= n; j ) {
if (minePositions[i - 1][j 1]) grid[i][j] ;
if (minePositions[i][j 1]) grid[i][j] ;
if (minePositions[i 1][j 1]) grid[i][j] ;
if (minePositions[i - 1][j]) grid[i][j] ;
if (minePositions[i 1][j]) grid[i][j] ;
if (minePositions[i - 1][j - 1]) grid[i][j] ;
if (minePositions[i][j - 1]) grid[i][j] ;
if (minePositions[i 1][j - 1]) grid[i][j] ;
}
for (int j = 1; j <= n; j ) {
if (minePositions[i][j]) System.out.print("* ");
else System.out.print(grid[i][j] " ");
}
System.out.print("\n");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/341715.html
上一篇:獲取上個月的最后日期
下一篇:如何將輸入與檔案資料進行比較
