蓝书 第一章 例题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 填充正方形的主要内容,如果未能解决你的问题,请参考以下文章

蓝书 第一章 例题10 正整数序列

蓝书第一章 例题3 分金币

蓝书 第一章 例题5 蚂蚁 uva

蓝书 第一章 例题1 勇者斗恶龙

《通信原理》复习笔记1----第一章绪论相关例题

数学与猜想的图书目录