简介:方格填字母,相邻的要求互异
分析:
题目要求输出字典序最小的方案,
实际上这就是在提示我们这道题的解法:
我们直接贪心的向方格里填数就好了
一开始我还以为要搜索,一道搜到一种合法方案就停止,实际上这就是贪心填数的过程
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int mp[20][20],n;
void solve()
{
int i,j,k;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (mp[i][j]!=-1) continue;
bool ff;
for (k=0;k<26;k++)
{
ff=1;
if (i>1&&mp[i-1][j]==k) ff=0;
if (j>1&&mp[i][j-1]==k) ff=0;
if (i<n&&mp[i+1][j]==k) ff=0;
if (j<n&&mp[i][j+1]==k) ff=0;
if (ff)
{
mp[i][j]=k;
break;
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
for (int cas=1;cas<=T;cas++)
{
scanf("%d",&n);
char s;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
cin>>s;
if (s=='.') mp[i][j]=-1;
else mp[i][j]=s-'A';
}
solve();
printf("Case %d:
",cas);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
printf("%c",mp[i][j]+'A');
printf("
");
}
}
return 0;
}