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;
}