蓝书 第一章 例题14 填充正方形
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝书 第一章 例题14 填充正方形相关的知识,希望对你有一定的参考价值。
题意:
在一个n * n的网格中填了一些大写字母,要求把剩下的格子也填上大写字母,使得任意两个相邻格子的字母不同。
如果有多个解,按要求从上到下、从左到右的顺序把所有格子连接起来的字典序最小
思路:
因为要按从左到右从上到下的顺序字典序排序,要想字典序最小,肯定是前面的字母越小越好。而一个字母周围最多已经存在四个字母,所以只要在每个方格循环字符从前往后就可了。
#include<iostream>
#include<algorithm>
using namespace std;
char g[15][15];
int kase;
void solve()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>g[i][j];
cout<<"Case "<<++kase<<":\\n";
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][j]=='.')
{
for(char c='A';c<='Z';c++)
{
int f=1;
if(i>1&&g[i-1][j]==c)f=0;
if(i<n&&g[i+1][j]==c)f=0;
if(j>1&&g[i][j-1]==c)f=0;
if(j<n&&g[i][j+1]==c)f=0;
if(f)
{
g[i][j]=c;break;
}
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<g[i][j];
}
cout<<"\\n";
}
}
int main()
{
int _;cin>>_;
while(_--)
{
solve();
}
return 0;
}
以上是关于蓝书 第一章 例题14 填充正方形的主要内容,如果未能解决你的问题,请参考以下文章