泡泡龙
題目描述
這是一個簡化版的網絡游戲,在一個NN方塊構成的棋盤中,每個方塊均涂上紅、黃、藍、綠(記為1、2、3、4)中的一種顏色,游戲者可以在最底行任意找一個方塊,用鼠標雙擊這個方塊,于是該方塊及與之相鄰(即上、下、左、右四個方向上有公共邊)的所有的同色方塊均被消掉,因而下方失去支持的方塊將會自動落下填補空位。樣例給出一個44的棋盤樣例,當游戲者雙擊最底層左邊第二個方塊后,將會形成輸出結果的布局。
你對任務是編寫一個泡泡龍模擬程序,對于給定的一個初始棋盤,計算游戲者雙擊最底層某個方塊后棋盤的布局將會如何。
輸入
第1行有兩個正整數N和M(1<=M<=N<=100),其中N表示棋盤的規模,而M表示游戲者將雙擊最底層從左邊數起的第M個方塊。接下來的N行每行有N個1~4的整數組成,表示一個初始的棋盤,同一行相鄰兩個數之間用一個空格隔開。
輸出
N行,每行用N個數給出游戲結束后棋盤的布局,沒有方塊的格子用0表示,同一行相鄰的兩個數之間也用一個空格分開。
輸入樣例
4 2
1 2 3 4
4 2 4 4
3 4 4 3
1 4 4 3
輸出樣例
1 0 0 0
4 0 0 0
3 2 0 3
1 2 3 3
思路
這道題的難點不在于如何消除方塊,而在于相除方塊后如何讓它往下掉
往下掉的這個步驟需要用到雙指針,簡單解釋一下:
5
0
4
4
3
a → 3 ← b
將a指針向上移
5
0
4
4
a → 3
3 ← b
此時a指針上的數=b指針上的數,b指針上移
一只這樣做,一單碰到空的將上面的填下來,然后繼續上移
代碼
#include<iostream> using namespace std; int n, m, a[110][110], fx[4][2]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; bool f[110][110]; void dfs(int x, int y) {int xx, yy;f[x][y] = true;for(int i = 0; i < 4; i++){ xx = x + fx[i][0];yy = y + fx[i][1];if(xx < 1 || xx > n || yy < 1 || yy > n || a[xx][yy] != a[x][y] || f[xx][yy])continue;dfs(xx, yy);} } int main() {ios :: sync_with_stdio(0);cin >> n >> m;for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)cin >> a[i][j];dfs(n, m);//使方塊往下掉 for(int j = 1; j <= n; j++) //按照列循環 {int p = n; //雙指針 for(int i = n; i >= 1; i--) //倒序循環列 if(!f[i][j])a[p--][j] = a[i][j];for(int i = p; i >= 1; i--)a[i][j] = 0; }for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)cout << a[i][j] << " ";cout << endl;}return 0; }總結
- 上一篇: 奇迹暖暖一直显示服务器满怎么办,奇迹暖暖
- 下一篇: 技术写作入门