CSP-S 提高组 01基础算法

CSP-S 提高组 01基础算法

1、模拟

例题①:特殊字符

【问题描述】 N*N(N<9)的网格中,填写一些特殊字符,分别是 !@#\(%……&\*(**,他们之间的**大小关系**是**!<@<#<\)<%<^<&<*<(

要求用这些字符填满N*N的网格,每个网格的字母上下左右各不相同,同时要求网格元素尽可能的小。(有些网格可能已经预填字符)(大小比较,先行后列

输入k组数据,输入N,输入N*N网格。

例如:2*2的网格中,

!@      @!
@!   <  !@

【样例输入】
2
3
...
...
...
3
...
!..
...
【样例输出】
!@!
@!@
!@!

@!@
!@!
@!@

#include <iostream>
#include <cstdio>
#define maxn 10
using namespace std;
char grid[maxn][maxn];
       //下标: 012345678
char str[10]="!@#$%^&*(";
int num[10];
int main(){
	//k组数据 
	int k,n;
	scanf("%d", &k);
	while (k--){
		scanf("%d", &n);
		for (int i=0; i<n; i++)
			cin >> grid[i];
		//要求:上下左右各不相同,同时要求网格元素尽可能的小
		for (int i=0; i<n; i++)
			for (int j=0; j<n; j++)
				//需要填的位置选择相应的最小字符 
				if (grid[i][j] == '.')
					for (int ch=0; ch<9; ch++){
						bool flag = true;
						if (i > 0 && grid[i-1][j] == str[ch]) flag = false;
						if (i < n-1 && grid[i+1][j] == str[ch]) flag = false;
						if (j > 0 && grid[i][j-1] == str[ch]) flag = false;
						if (j < n-1 && grid[i][j+1] == str[ch]) flag = false;
						if (flag) {
							grid[i][j] = str[ch];
							break;
						}
					}
		for (int i=0; i<n; i++)
			cout << grid[i] << endl;
	}
	return 0;
}
posted @ 2021-09-09 20:31  Exstory  阅读(407)  评论(0编辑  收藏  举报