給定字符網格('.' 空地,'X' 物體),從指定點 (r,c) 開始,八方向連通的 'X' 形成一個物體。求該物體周長(每個格子邊長 1,相鄰共享邊不計入周長)。網格 ≤ 20×20。
DFS 搜索聯通塊:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 25;
char grid[N][N];
bool vis[N][N];
int n, m, sr, sc, ans;
int dir[8][2] = {{0,1},{0,-1},{1,0},{-1,0},{-1,-1},{-1,1},{1,-1},{1,1}};
void dfs(int x, int y) {
if (vis[x][y]) return;
vis[x][y] = true;
int cnt = 4;
for (int i=0;i<8;i++) {
int nx=x+dir[i][0], ny=y+dir[i][1];
if (nx<0||nx>=n||ny<0||ny>=m||grid[nx][ny]!='X') continue;
dfs(nx, ny);
if (dir[i][0]==0 || dir[i][1]==0) cnt--; // 直角相鄰
}
ans += cnt;
}
int main() {
while (cin >> n >> m >> sr >> sc, n||m||sr||sc) {
sr--; sc--;
memset(vis, 0, sizeof(vis));
for (int i=0;i> grid[i];
ans = 0;
dfs(sr, sc);
cout << ans << endl;
}
return 0;
}
網格 ≤ 400 格,DFS 瞬間完成。