UVA

来源:互联网 发布:清华斯维尔软件下载 编辑:程序博客网 时间:2024/06/02 06:42

刚刚10分钟AC的水题
题目已经要求:
1.上下左右各不相同
2.保证解的字典序最小
因此可以想到整个矩阵中最多包含 A B C D E 四个字母,
所以从矩阵 左到右,上到下 枚举就好了
为了简便判断,我们让矩阵存在于 (1,1) - (n,n)之间
ok

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<set>#include<stack>#include<queue>#include<algorithm>// cout << "  ===  " << endl;using namespace std;typedef long long ll;const int maxn = 100 + 7, INF = 0x3f3f3f3f, mod = 1e9+7;int T, n;char s[maxn][maxn];int dx[4] = {0, -1, 0, 1};int dy[4] = {-1, 0, 1, 0};void init() {    for(int i = 0; i < n+2; ++i)        for(int j = 0; j < n+2; ++j)            s[i][j] = '.';    for(int i = 1; i <= n; ++i)        scanf("%s", s[i]+1);}void solve() {    for(int i = 1; i <= n; ++i) {        for(int j = 1; j <= n; ++j) {            if(s[i][j] != '.') continue;            for(char c = 'A'; c <= 'E'; ++c) {                int f = 1;                for(int k = 0; k < 4; ++k) {                    if(s[i+dx[k]][j+dy[k]] == c) { f = 0; break; }                }                if(f) {                    s[i][j] = c;                    break;                }            }        }    }    for(int i = 1; i < n+1; ++i) {        for(int j = 1; j < n+1; ++j)            putchar(s[i][j]);        cout << endl;    }}int main() {    scanf("%d", &T);    int kase = 1;    while(T--) {        scanf("%d", &n);        init();        printf("Case %d:\n", kase++);        solve();    }    return 0;}
原创粉丝点击