【搜索】泡泡龍 DFS

題目描述


這是一個簡化版的網絡遊戲:在一個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輸出
*/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章