CSP-201512-2 消除類遊戲
阿新 • • 發佈:2019-01-25
問題描述
消除類遊戲是深受大眾歡迎的一種遊戲,遊戲在一個包含有n行m列的遊戲棋盤上進行,棋盤的每一行每一列的方格上放著一個有顏色的棋子,當一行或一列上有連續三個或更多的相同顏色的棋子時,這些棋子都被消除。當有多處可以被消除時,這些地方的棋子將同時被消除。
現在給你一個n行m列的棋盤,棋盤中的每一個方格上有一個棋子,請給出經過一次消除後的棋盤。
請注意:一個棋子可能在某一行和某一列同時被消除。 輸入格式 輸入的第一行包含兩個整數n, m,用空格分隔,分別表示棋盤的行數和列數。
接下來n行,每行m個整數,用空格分隔,分別表示每一個方格中的棋子的顏色。顏色使用1至9編號。 輸出格式 輸出n行,每行m個整數,相鄰的整數之間使用一個空格分隔,表示經過一次消除後的棋盤。如果一個方格中的棋子被消除,則對應的方格輸出0,否則輸出棋子的顏色編號。 樣例輸入 4 5
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3 樣例輸出 2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0 樣例說明 棋盤中所有的1以及最後一行的3可以被同時消除,其他的方格中的棋子均保留。 評測用例規模與約定 所有的評測用例滿足:1 ≤ n, m ≤ 30。 思路:起初是想分別從上下左右四個方向來一個個判斷,後來發現很多問題,比如元素在邊界或者元素離判斷方向的邊界小於3等等,根本寫不下去。後來就想幹脆按照列和行兩個來判斷,每次拿元素減去1來判斷相等,但是若連續等元素不是從第一個開始,又會出問題。最終從犯迷糊的狀態反應過來每次減去當前開始位置的值就ok了。這次也學了一個新點,就是陣列複製問題,還好發現了,否則真找不出原因。 以下是我的程式碼(100分)
現在給你一個n行m列的棋盤,棋盤中的每一個方格上有一個棋子,請給出經過一次消除後的棋盤。
請注意:一個棋子可能在某一行和某一列同時被消除。 輸入格式 輸入的第一行包含兩個整數n, m,用空格分隔,分別表示棋盤的行數和列數。
接下來n行,每行m個整數,用空格分隔,分別表示每一個方格中的棋子的顏色。顏色使用1至9編號。 輸出格式 輸出n行,每行m個整數,相鄰的整數之間使用一個空格分隔,表示經過一次消除後的棋盤。如果一個方格中的棋子被消除,則對應的方格輸出0,否則輸出棋子的顏色編號。 樣例輸入 4 5
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3 樣例輸出 2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0 樣例說明 棋盤中所有的1以及最後一行的3可以被同時消除,其他的方格中的棋子均保留。 評測用例規模與約定 所有的評測用例滿足:1 ≤ n, m ≤ 30。 思路:起初是想分別從上下左右四個方向來一個個判斷,後來發現很多問題,比如元素在邊界或者元素離判斷方向的邊界小於3等等,根本寫不下去。後來就想幹脆按照列和行兩個來判斷,每次拿元素減去1來判斷相等,但是若連續等元素不是從第一個開始,又會出問題。最終從犯迷糊的狀態反應過來每次減去當前開始位置的值就ok了。這次也學了一個新點,就是陣列複製問題,還好發現了,否則真找不出原因。 以下是我的程式碼(100分)
/** * 消除遊戲模擬 * @author Sun_24 */ import java.util.*; public class MainXiaoChu { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int [][]arr = new int[n][m]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ arr[i][j] = in.nextInt(); } } xiaoChu(arr,n,m); } static void xiaoChu(int arr[][],int n,int m){ //int brr[][] = (int[][])arr.clone(); /*學了新知識: 一定不能用clone,雖然資料複製了但是brr是arr的一個引用,若是brr資料更改,arr也會隨著更改。 其它的複製方法不會,慢慢學。*/ int brr[][] = new int[n][m]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ brr[i][j] = arr[i][j]; } } //brr來操作改變元素,arr用來判斷 for(int j=0;j<m;j++){//一列一列判斷 int q = 0; int snum = 0; for(int i=0;i<n;i++){ if(arr[i][j]-arr[q][j]==0){//每次和開始(斷點)處比較,若差為0說明相等 snum++; } if(arr[i][j]-arr[q][j]!=0 || i==n-1){ if(arr[i][j]-arr[q][j]==0 && i==n-1) i = n; if(snum>=3){ for(int k=i-1;k>=i-snum;k--){ brr[k][j] = 0; } snum = 1;//出現不一致時,行數已經指向新的開端,繼續迴圈i自加從下一行判斷 q = i; //所以snum要先置1; continue; } else{ snum = 1; q = i; continue; } } } } for(int i=0;i<n;i++){//一行一行判斷 int p = 0; int hnum = 0; for(int j=0;j<m;j++){ if(arr[i][j]-arr[i][p]==0){ hnum++; } if(arr[i][j]-arr[i][p]!=0 || j==m-1){ if(arr[i][j]-arr[i][p]==0 && j==m-1) j = m; if(hnum>=3){ for(int k=j-1;k>=j-hnum;k--){ brr[i][k] = 0; } hnum = 1; p = j; continue; } else{ hnum = 1; p = j; continue; } } } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ System.out.print(brr[i][j]+" "); } System.out.println(); } } }