1. 程式人生 > >CSP-201512-2 消除類遊戲

CSP-201512-2 消除類遊戲

問題描述   消除類遊戲是深受大眾歡迎的一種遊戲,遊戲在一個包含有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分)
/**
 * 消除遊戲模擬
 * @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();
		}
		
	}
}