題目描述
這是一個簡化版的網絡遊戲:在一個N×N方塊構成的棋盤中,每個方塊均塗上紅、黃、藍、綠(記爲l、2、3、4)中的一種顏色,遊戲者可以在最底行任意找一個方塊,用鼠標雙擊這個方塊,於是該方塊及與之相鄰(即在上、下、左、右四個方向上有公共邊)的所有的同色方塊均被消掉,而因下方失去支持的方塊將會自由落下填補空位。樣例中給出一個4×4的棋盤樣例,當遊戲者雙擊最底層左邊第二個方塊後,將會形成輸出結果的佈局。
你的任務是編寫一個泡泡龍模擬程序,對於給定的一個初始棋盤,計算遊戲者雙擊最底層某個方塊後棋盤的佈局將會如何。
輸入
第1行有兩個正整數N和M(I≤M≤N≤I00),其中N表示棋盤的規模,而M則表示遊戲者將雙擊最底層從左邊數起的第M個方塊。接下來的N行每行有N個l~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
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <stack>
#define LL long long
#define INF 0x7fffffff
#define MAX 105
#define PI 3.1415926535897932
#define E 2.718281828459045
using namespace std;
int n,m;
int a[MAX][MAX];
int b[MAX][MAX];
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
void dfs(int x,int y, int value)
{
if(a[x][y]==value) a[x][y]=0;
else return;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if (xx<1 || xx>n || yy>n ||yy<1) continue;
else dfs(xx,yy,value);
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
int x,y;
x=n;
y=m;
int value=a[n][m];
dfs(x,y,value);
int ii=1;
for(int i=1;i<=n;i++)
for(int j=n;j>=1;j--)
{
if(j % n ==0 ) ii=1;
if(a[j][i]!=0) { b[i][ii]=a[j][i]; ii++;}
}
for(int i=n;i>=1;i--)
{
for(int j=1;j<=n;j++)
printf ("%d ",b[j][i]);
printf("\n");
}
return 0;
}
/*
思路:
先DFS將消去的數字變成0 在用數組b進行存儲
存儲時注意對數據0的處理以及行列的關係
然後將數組b輸出
*/