您的位置:首页 > 其它

Uva 11520 填充正方形

2017-04-12 22:04 447 查看
题目链接:https://vjudge.net/problem/UVA-11520

题意:

给定一个n*n的正方形,把剩下的格子中填满大写字母,任意两个相邻的格子字母不同,要求最后字典序最小;

分析:

第一想法回溯啊,当然是不对的,100个点回溯会死人的!

其实,可以发现,每个点不可能说,由于前面的决策,后来不能满足了,相邻的点有4个,我有26个英文字母。

#include <bits/stdc++.h>

using namespace std;

const int maxn = 10 + 5;
int n;
char maps[maxn][maxn];

int main()
{
int t;
scanf("%d",&t);
int kase = 1;
while(t--) {
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",maps[i]);

for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(maps[i][j]=='.') {
for(char ch='A';ch<='Z';ch++) {
bool ok = true;
if(i>0&&maps[i-1][j]==ch) ok = false;
if(i<n-1&&maps[i+1][j]==ch) ok = false;
if(j>0&&maps[i][j-1]==ch) ok = false;
if(j<n-1&&maps[i][j+1]==ch) ok = false;
if(ok) {maps[i][j] = ch;break;}
}
}
}
}

printf("Case %d:\n",kase++);
for(int i=0;i<n;i++)
printf("%s\n",maps[i]);

}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: