【簡單dfs】Bubble Cup 14 - Finals Online Mirror (Unrated, ICPC Rules, Teams Preferred, Div. 2), problem: (J) Robot Factory,
阿新 • • 發佈:2021-10-29
傳送門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; } intmain(){ 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)未標記