题目大意:用26个大写字母将矩阵填满,要求挨在一起的相同字母必须构成一个正方形,要求构成的矩阵的字典序最小(从左往右,从上到下)
题解:从上往下从前往后,能小就小。
(i,j)能够染颜色k当且仅当(i-1,j)与(i,j+1)没有染颜色k,且第i行前面的颜色k都是第一行,那么就将正方形都扩大一圈
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 103
using namespace std;
int n,m;
int a[N][N];
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if (a[i][j]) continue;
for (int k=1;k<=26;k++)
{
if (a[i-1][j]==k||a[i][j+1]==k) continue;
if (a[i][j-1]==k||j==1){
int num=0; int l=i;
while (l<=n&&a[l][j-1]==k) num++,l++;
num++;
if (i+num-1>n) continue;
for (int t=i;t<=i+num-1;t++) a[t][j]=k;
for (int t=j;t>=j-num+1;t--) a[i+num-1][t]=k;
}
a[i][j]=k;
break;
}
}
//for (int i=1;i<=m;i++)
//cout<<a[1][i]<<" ";
//cout<<endl;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
printf("%c",a[i][j]+64);
printf("\n");
}
}