描述
在一个n*n的网格中填写了一些大写字母,你的任务是把剩下的格子中也填满大写字母,使得任意相邻格子中的字母不同.如果有多种填法,则要求按照从上到下,从左到右的顺序把所有格子连起来得到的字符串的字典序应最小.
输入
多组测试数据,每组测试数据的第一行为一个正整数n.(1<=n<=10),接下来n行分别有n个字符代表n*n的网格,为了清晰起见,用’.’代表没有大写字母的网格.
输出
对于每组数据输出填满大写字母后的网格.每组测试数据间有一个空行,最后一组测试数据后面没有空行.
输入样例 1
3
...
...
...
3
...
A..
...
输出样例 1
ABA
BAB
ABA
BAB
ABA
BAB
这个题目看似要考虑到因素有点多,其实是吓你的,我们只需要考虑不同位置可以填入的最小的数即可,在四个角只有可能是A,B,C在边线(不包含四个角)只有A,B,C,D在内部只有A,B,C,D,E。附近的数据少了那个那么它要填入的就是确少的那个字符。
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
getchar();
char a[n][n];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>a[i][j];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
if(a[i][j]=='.')
{
if(i>0&&i<n-1&&j>0&&j<n-1)
{
if(a[i+1][j]!='A'&&a[i][j-1]!='A'&&a[i][j+1]!='A'&&a[i-1][j]!='A')
a[i][j]='A';
else if(a[i+1][j]!='B'&&a[i][j-1]!='B'&&a[i][j+1]!='B'&&a[i-1][j]!='B')
a[i][j]='B';
else if(a[i+1][j]!='C'&&a[i][j-1]!='C'&&a[i][j+1]!='C'&&a[i-1][j]!='C')
a[i][j]='C';
else if(a[i+1][j]!='D'&&a[i][j-1]!='D'&&a[i][j+1]!='D'&&a[i-1][j]!='D')
a[i][j]='D';
else
a[i][j]='E';
}
if(i==0&&j==0)
{
if(a[i+1][j]!='A'&&a[i][j+1]!='A')
a[i][j]='A';
else if(a[i+1][j]!='B'&&a[i][j+1]!='B')
a[i][j]='B';
else
a[i][j]='C';
}
if(i==0&&j==n-1)
{
if(a[i+1][j]!='A'&&a[i][j-1]!='A')
a[i][j]='A';
else if(a[i+1][j]!='B'&&a[i][j-1]!='B')
a[i][j]='B';
else
a[i][j]='C';
}
if(i==0&&j!=n-1&&j!=0)
{
if(a[i+1][j]!='A'&&a[i][j-1]!='A'&&a[i][j+1]!='A')
a[i][j]='A';
else if(a[i+1][j]!='B'&&a[i][j-1]!='B'&&a[i][j+1]!='B')
a[i][j]='B';
else if(a[i+1][j]!='C'&&a[i][j-1]!='C'&&a[i][j+1]!='C')
a[i][j]='C';
else
a[i][j]='D';
}
if(i==n-1&&j==0)
{
if(a[i][j+1]!='A'&&a[i-1][j]!='A')
a[i][j]='A';
else if(a[i][j+1]!='B'&&a[i-1][j]!='B')
a[i][j]='B';
else
a[i][j]='C';
}
if(i==n-1&&j==n-1)
{
if(a[i][j-1]!='A'&&a[i-1][j]!='A')
a[i][j]='A';
else if(a[i][j-1]!='B'&&a[i-1][j]!='B')
a[i][j]='B';
else
a[i][j]='C';
}
if(i==n-1&&j!=0&&j!=n-1)
{
if(a[i][j-1]!='A'&&a[i][j+1]!='A'&&a[i-1][j]!='A')
a[i][j]='A';
else if(a[i][j-1]!='B'&&a[i][j+1]!='B'&&a[i-1][j]!='B')
a[i][j]='B';
else if(a[i][j-1]!='C'&&a[i][j+1]!='C'&&a[i-1][j]!='C')
a[i][j]='C';
else
a[i][j]='D';
}
if(i!=0&&i!=n-1&&j==0)
{
if(a[i-1][j]!='A'&&a[i][j+1]!='A'&&a[i+1][j]!='A')
a[i][j]='A';
else if(a[i-1][j]!='B'&&a[i][j+1]!='B'&&a[i+1][j]!='B')
a[i][j]='B';
else if(a[i-1][j]!='C'&&a[i][j+1]!='C'&&a[i+1][j]!='C')
a[i][j]='C';
else
a[i][j]='D';
}
if(i!=0&&i!=n-1&&j==n-1)
{
if(a[i-1][j]!='A'&&a[i][j-1]!='A'&&a[i+1][j]!='A')
a[i][j]='A';
else if(a[i-1][j]!='B'&&a[i][j-1]!='B'&&a[i+1][j]!='B')
a[i][j]='B';
else if(a[i-1][j]!='C'&&a[i][j-1]!='C'&&a[i+1][j]!='C')
a[i][j]='C';
else
a[i][j]='D';
}
}
else
continue;
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout<<a[i][j];
cout<<endl;
}
cout<<endl;
}
return 0;
}