D - Grid Coloring

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 (1iN), there are exactly ai squares painted in Color i. Here,a1+a2++aN=HW.
  • For each i (1iN), 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

  • 1H,W100
  • 1NHW
  • ai1
  • 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

2 2
3
2 1 1
Sample Output 1

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

3 5
5
1 2 3 4 5
Sample Output 2

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

题意:颜色相同的放的位置相邻。

思路:因为是把相同颜色的相邻,故可以走S型,一种颜色用完就用另一种补上,依次下去就可以了,所以可以把所有的颜色平铺下去,然后按行数的奇还是偶来决定是从前截断,还是从后截断,截断得到的长度就为列数。

#include
using namespace std;
int a[10005];
int b[10005];
int main()
{
int h, w;
cin >> h >> w;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> b[i];
int temp = 1;
int j = 1;
for (int i = 1; i <= n; i++)
{
while (b[i] > 0)
{
a[j] = temp;
j++;
b[i]--;
}
temp++;
}
for (int i = 1; i <= h; i++)
{
if (i % 2 == 1)
{
for (int p = w*(i - 1) + 1; p <= i*w; p++)
{
cout << a[p] << " ";
}
if (i != h)
cout << endl;
}
else if (i % 2 == 0)
{
for (int p = w*i; p >= w*(i - 1) + 1; p--)
{
cout << a[p] << " ";
}
if (i != h)
cout << endl;
}
}
return 0;
}

你可能感兴趣的:(平时学习对应知识点练习题)