Codeforces Round #297 (Div. 2) 525D Arthur and Walls(dfs)
题目链接:点击打开链接
给出n * m的地图, '*'代表墙, '.'代表房间, 墙能够变为房间, 现要求房间为长方形, 问最少须要变化后的房间.
dfs的条件是四个点组成的形状仅仅有一个'*', 于是将这个墙变为房间, 继续dfs, 能够使得变化最少.
AC代码:
#include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "queue" #include "stack" #include "cmath" #include "utility" #include "map" #include "set" #include "vector" #include "list" #include "string" #include "cstdlib" using namespace std; typedef long long ll; const int MOD = 1e9 + 7; const int INF = 0x3f3f3f3f; const int MAXN = 2005; int n, m; char maze[MAXN][MAXN]; void Dfs(int x, int y) { if(x >= n - 1 || y >= m - 1 || x < 0 || y < 0) return; int xx, yy, s = 0; for(int i = 0; i < 2; ++i) for(int j = 0; j < 2; ++j) if(maze[x + i][y + j] == '*') { s++; xx = x + i; yy = y + j; } if(s == 1) { maze[xx][yy] = '.'; for(int i = -1; i < 1; ++i) for(int j = -1; j < 1; ++j) Dfs(xx + i, yy + j); } } int main(int argc, char const *argv[]) { scanf("%d %d", &n, &m); for(int i = 0; i < n; ++i) scanf("%s", maze[i]); for(int i = 0; i < n - 1; ++i) for(int j = 0; j < m - 1; ++j) Dfs(i, j); for(int i = 0; i < n; ++i) printf("%s\n", maze[i]); return 0; }