uva 11520
分类: 贪心
题意: 有一个n*n的格子,里面可能又字母,可能是'.'代表没字母,求出一种字母填法,使得从上到下,从左到右字典序最小
输入: 组数T,初始方阵
输出: 填好的方阵
解法: 关键在于理解题意
只要满足从上到下从左到右字典序最小,那么就按照从上到下从左到右的顺序贪心填写
每一次与四个方向比较
#include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <iostream> #include <string> #include <sstream> #include <cstring> #include <queue> using namespace std; ///宏定义 const int INF = 990000000; const int MAXN = 15; const int maxn = MAXN; ///全局变量 和 函数 int n; char maze[maxn][maxn]; char maxChar(char c1, char c2) { if (c1 > c2) return c1; return c2; } void fillSquare() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (maze[i][j] != '.') continue; for (char ss = 'A'; ss <= 'Z'; ss++) { if (i > 0 && ss == maze[i - 1][j]) continue; if (j < n - 1 && ss == maze[i][j + 1]) continue; if (i < n - 1 && ss == maze[i + 1][j]) continue; if (j > 0 && ss == maze[i][j - 1]) continue; maze[i][j] = ss; break; } } } } int main() { ///变量定义 int T; int cases = 1; scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%s", maze[i]); } fillSquare(); printf("Case %d:\n", cases++); for (int i = 0; i < n; i++) { printf("%s\n", maze[i]); } } ///结束 return 0; }