作者bb7889 (9m)
看板java
標題[問題] 把踩地雷的陣列以數字表示結果
時間Sat Apr 29 12:10:44 2017
大家好 最近做到一題對我來說滿困擾的題目
雖然我做出來的答案 題庫跑case的結果是對的
但是還是覺得應該有更好的解法 所以上來問問看
(因為我沒修過演算法 所以覺得自己很土法煉鋼= =)
題目:
簡單來說 題目會給Input
第一行先表示這個踩地雷是nxn的陣列
接下來會給n行其中陣列的排序 有地雷就會寫1 沒有就是0
那output就是要印出每一格的周邊地雷數目
本身是地雷給X 不然就給數字 都沒有給-
ex.
1.
input:
4 4
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 1
output:
111-
1X1-
1121
--1X
2.
input:
4 6
0 0 0 0 0 1
0 0 0 0 0 0
0 1 0 0 0 0
1 0 0 0 0 0
output:
----1X
111-11
2X1---
X21---
我的寫法:
import java.util.Scanner;
public class mineSweeper {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int numX = sc.nextInt();
int numY = sc.nextInt();
sc.nextLine();
String[][] inputArray = new String[numX][];
String[][] outputArray = new String[numX][numY];
for(int i=0;i<numX;i++){
inputArray[i] = sc.nextLine().split(" ");
}
for(int j=0;j<numX;j++){
for(int k=0;k<numY;k++){
if(inputArray[j][k].equals("1")){
outputArray[j][k]="X";
}else{
int mineAround=0;
if(j>0 & k>0){
if(inputArray[j-1][k-1].equals("1")){
mineAround++;
}
}
if(j>0 ){
if(inputArray[j-1][k].equals("1")){
mineAround++;
}
}
if(j>0 & k+1<numY){
if(inputArray[j-1][k+1].equals("1")){
mineAround++;
}
}
if(k+1<numY ){
if(inputArray[j][k+1].equals("1")){
mineAround++;
}
}
if(j+1<numX & k+1<numY ){
if(inputArray[j+1][k+1].equals("1")){
mineAround++;
}
}
if(j+1<numX ){
if(inputArray[j+1][k].equals("1")){
mineAround++;
}
}
if(j+1<numX & k>0 ){
if(inputArray[j+1][k-1].equals("1")){
mineAround++;
}
}
if(k>0 ){
if(inputArray[j][k-1].equals("1")){
mineAround++;
}
}
if(mineAround==0){
outputArray[j][k]="-";
}else{
outputArray[j][k]=String.valueOf(mineAround);
}
}
}
}
for(int i=0;i<numX;i++){
for(int j=0;j<numY;j++){
System.out.print(outputArray[i][j]);
}
System.out.println();
}
}
sc.close();
}
}
----------------------------------(分隔線)--------------------------------
程式碼是直接從IDE貼上在用手排的 有點亂不好意思
如果有其他不符合板規的地方 麻煩再跟我說一下 我會改
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.4.126
※ 文章網址: https://www.ptt.cc/bbs/java/M.1493439046.A.C28.html
推 lazarus1121: 幫output打x的時候可以順便幫他四周8格+1,應該能省 04/29 13:06
→ lazarus1121: 不少時間 04/29 13:06
→ lazarus1121: 整張input掃完output就直接出來了 04/29 13:09
但是這還是要考慮到array index outofbound的問題
而且因為輸出的是string 所以'-'也要另外處理的感覺
→ gameking: 你要更簡單其實用一維陣列就可以寫了 但是程式碼變簡單 04/29 13:09
→ gameking: 就表示你寫的時候想法會複雜很多 普法煉鋼程式反而易懂 04/29 13:09
恩..我了解程式碼這樣好看許多
我只是在想有沒有厲害的演算法能夠更聰明的做好
※ 編輯: bb7889 (140.119.121.6), 04/29/2017 13:31:32
→ gameking: 照一樓講的方法可行阿 你OUTPUT弄成INT陣列就好了 04/29 14:16
→ gameking: 反正地雷最多數字到8 你有地雷的地方就設成9 沒有就0 04/29 14:17
→ gameking: 整個INPUT掃完 OUTPUT的INT陣列完成 04/29 14:17
→ gameking: 再用一個迴圈判別數字來輸出就好了 沒有一定要STRING存 04/29 14:18
→ gameking: 每個單位檢查旁邊八格有無地雷 VS 有地雷的旁邊八格+1 04/29 14:22
→ gameking: 明顯後者快很多啊 04/29 14:23