UVa 11520 填充正方形

原创 2013年12月08日 23:00:23

In this problem, you have to draw a square using uppercase English Alphabets.

To be more precise, you will be given a square grid with some empty blocks and others already filled for you with some letters to make your task easier. You have to insert characters in every empty cell so that the whole grid is filled with alphabets. In doing so you have to meet the following rules:

 

  1. Make sure no adjacent cells contain the same letter; two cells are adjacent if they share a common edge.  
  2. There could be many ways to fill the grid. You have to ensure you make the lexicographically smallest one. Here, two grids are checked in row major order when comparing lexicographically.

 

Input
The first line of input will contain an integer that will determine the number of test cases. Each case starts with an integer n( n<=10 ), that represents the dimension of the grid. The next n lines will contain n characters each. Every cell of the grid is either a ‘.’ or a letter from [A, Z]. Here a ‘.’ Represents an empty cell.

 

Output
For each case, first output Case #: ( # replaced by case number ) and in the next n lines output the input matrix with the empty cells filled heeding the rules above.
 
Sample Input                       Output for Sample Input  

2

3

...

...

...

3

...

A..

... 

Case 1:

ABA

BAB

ABA

Case 2:

BAB

ABA

BAB



题意:给出一个填有大写字母的正方形矩阵,要求在剩余空格内填上大写字母使得每个字母相邻位置不同,有多种解时,字典序要求最小的一个。

思路:直接从A开始遍历即可,字典序最小从A开始遍历到Z时肯定为最小。

#include <iostream>
using namespace std;

#define MAXN 15

char grid[MAXN][MAXN];

int main()
{
	int T, n;
	cin>>T;
	int cas = 1;
	for (int k = 0; k < T; k++)
	{
		cin>>n;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				cin>>grid[i][j];


		for (i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				if (grid[i][j] == '.')
				{
					for (char ch = 'A'; ch <= 'Z'; ch++)//小到大
					{
						int flag = true;
						if (i > 0 && grid[i - 1][j] == ch) flag = false;
						if (i < n - 1 && grid[i + 1][j] == ch) flag = false;
						if (j > 0 && grid[i][j - 1] == ch) flag = false;
						if (j < n - 1 && grid[i][j + 1] == ch) flag = false;
						if (flag) 
						{
							grid[i][j] = ch;
							break;
						}
					}
				}
		
		printf("Case %d:\n", cas ++);
		for (i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
				cout<<grid[i][j];
			cout<<endl;

		}
		
	}
	return 0;
}


例题1.14 填充正方形 UVa11520

1.题目描述:点击打开链接 2.解题思路:本题要求字典序最小,由于n的范围比较小,直接尝试按照字典序填写每个格子即可。 3.代码: #define _CRT_SECURE_NO_WARNINGS...

uva11520 Fill the Square

贪心
  • sdfzyhx
  • sdfzyhx
  • 2016年11月10日 17:50
  • 322

uva 11520

题意:有一个n×n的矩阵,矩阵元素有'.'和大写字母,要求把'.'全部替换为大写字母使每个元素的上下左右的元素和自己不相同,且从左到右从上到下字典序最小,输出矩阵。 题解:n最大10,可以暴力,因为...

UVa 11520 - Fill the Square

Problem A Fill the Square Input: Standard Input Output: Standard Output   In this problem, you ...

UVA - 11520 - Fill the Square(贪心)

题意:给定一个n * n(1 的格子中的字母不同,且从上至下,从左至右,组成一个字符串后字典序最小。 由于组成字符串后的长度都为n * n,故字典序越往前的字母决定的优先级越大,所以贪心即可,从...

uva 11520 Fill the Square(枚举)

uva 11520 Fill the Square In this problem, you have to draw a square using uppercase Engl...

UVA 11520 Fill the Square

从上到下从左到右填充可能的最小的字符就行了。 #include #include #include using namespace std; char arr[13][13]; void f...

UVa11520

Problem: Fill the Square Description: 有一个矩阵,当中的元素是大写字母,但是有个前提,相邻的位置大写字母不能相同,现在这个矩阵中的某些位置已近有字母了,要你把这...

UVa 11520 Fill the Square (贪心&字典序)

11520 - Fill the Square Time limit: 1.000 seconds http://uva.onlinejudge.org/index.php?option=com_...

uva - 11520 - Fill the Square(贪心、字典序)

题意:在一个n*n的网格中填了一些大写字母,你的任务是把剩下的各自中也填满大写字母,使得任意两个相邻的格子(有公共边)中的字母不同。如果有多种解法,则要求按照从上到下、从左到右的顺序把所有格子连接起来...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVa 11520 填充正方形
举报原因:
原因补充:

(最多只允许输入30个字)