AtCoder Regular Contest 080 D - Grid Coloring

Time limit : 2sec / Memory limit : 256MB

Score : 400 points

Problem Statement

We have a grid with H rows and W columns of squares. Snuke is painting these squares in colors 12N. Here, the following conditions should be satisfied:

  • For each i (1≤iN), there are exactly ai squares painted in Color i. Here, a1+a2+…+aN=HW.
  • For each i (1≤iN), the squares painted in Color i are 4-connected. That is, every square painted in Color i can be reached from every square painted in Color i by repeatedly traveling to a horizontally or vertically adjacent square painted in Color i.

Find a way to paint the squares so that the conditions are satisfied. It can be shown that a solution always exists.

Constraints

  • 1≤H,W≤100
  • 1≤NHW
  • ai≥1
  • a1+a2+…+aN=HW

Input

Input is given from Standard Input in the following format:

H W
N
a1 a2  aN

Output

Print one way to paint the squares that satisfies the conditions. Output in the following format:

c11  c1W
:
cH1  cHW

Here, cij is the color of the square at the i-th row from the top and j-th column from the left.


Sample Input 1

Copy
2 2
3
2 1 1

Sample Output 1

Copy
1 1
2 3

Below is an example of an invalid solution:

1 2
3 1

This is because the squares painted in Color 1 are not 4-connected.


Sample Input 2

Copy
3 5
5
1 2 3 4 5

Sample Output 2

Copy
1 4 4 4 3
2 5 4 5 3
2 5 5 5 3

Sample Input 3

Copy
1 1
1
1

Sample Output 3

Copy
1

要求输出一种满足条件的情况,那就一行一行的涂色,涂到最后一个格子紧接着从下一行相邻的格子开始倒着涂,如此进行。
代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int h,w,n,num[10000];
int main() {
    int cnt = 1;
    scanf("%d%d",&h,&w);
    scanf("%d",&n);
    for(int i = 0;i < n;i ++) {
        scanf("%d",&num[i]);
    }
    for(int i = 0;i < h;i ++) {
        while(!num[cnt - 1]) cnt ++;
        string s = to_string(cnt);
        num[cnt - 1] --;
        for(int j = 1;j < w;j ++) {
            while(!num[cnt - 1]) cnt ++;
            s = i % 2 ? (to_string(cnt) + " " + s) : (s + " " + to_string(cnt));
            num[cnt - 1] --;
        }
        cout<<s<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/8023spz/p/10864630.html