题目链接:
给出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;}