1. 程式人生 > 其它 >【簡單dfs】Bubble Cup 14 - Finals Online Mirror (Unrated, ICPC Rules, Teams Preferred, Div. 2), problem: (J) Robot Factory,

【簡單dfs】Bubble Cup 14 - Finals Online Mirror (Unrated, ICPC Rules, Teams Preferred, Div. 2), problem: (J) Robot Factory,

傳送門Problem - 1600J - Codeforces

題目

題意

給定n行m列, 求每個連通塊由多少格子組成,並將格子數從大到小排序輸出

對於每個格子都有一個數(0~15),將其轉化為二進位制(四位數),比如1010

表示北為1,不可通東為0,可通南為1,不可通西為0,可通。

1表示牆,不可通,四位數字依次表示為北東南西

【注意:比如樣例9到14去,只需判斷9東邊是否可通即可,14不用管】

題解

差不多和dfs的板子一樣~

AC程式碼

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e3+10; int n, m, res[N*N], idx = -1, step; int dx[4] = {0,1,0,-1}, dy[4] = {-1,0,1,0};//西南東北 bool book[N][N]; int a[N][N]; void dfs(int x, int y) { bool flag = 0; int xx = a[x][y]; for(int i = 0; i < 4; i ++) { if((xx>>i)&1==1) continue;
int tx = x+dx[i]; int ty = y+dy[i]; if(tx<0||tx>=n||ty<0||ty>=m) continue; if(!book[tx][ty]) { flag = 1; book[tx][ty] = 1; step++; dfs(tx, ty); } } if(!flag) return; } int
main(){ idx = -1; cin >> n >> m; for(int i = 0; i < n; i ++) for(int j = 0; j < m; j ++) cin >> a[i][j]; for(int i = 0; i < n; i ++) for(int j = 0; j < m; j ++) if(!book[i][j]) { step=1; book[i][j] = 1; dfs(i, j); res[++idx] = step; } sort(res, res+idx+1); for(int i = idx; i >= 0; i --)cout << res[i]<< ' '; puts(""); return 0; }

總結

不是很難,但是程式碼改了很久,有理解題意的問題,還有板子細節部分忘了

1.比如樣例9到14去,只需判斷9東邊是否可通即可,14不用管

2. n和m搞反了

3. 主函式中,每次進入dfs,初始(i,j)未標記