We have a grid with H rows and W columns of squares. Snuke is painting these squares in colors 1, 2, …, N. Here, the following conditions should be satisfied:
- For each i (1≤i≤N), there are exactly ai squares painted in Color i. Here,a1+a2+…+aN=HW.
- For each i (1≤i≤N), 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.
- 1≤H,W≤100
- 1≤N≤HW
- ai≥1
- a1+a2+…+aN=HW
Input is given from Standard Input in the following format:
H W N a1 a2 … aN
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.
2 2 3 2 1 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.
3 5 5 1 2 3 4 5
1 4 4 4 3 2 5 4 5 3 2 5 5 5 3
题意:颜色相同的放的位置相邻。
思路:因为是把相同颜色的相邻,故可以走S型,一种颜色用完就用另一种补上,依次下去就可以了,所以可以把所有的颜色平铺下去,然后按行数的奇还是偶来决定是从前截断,还是从后截断,截断得到的长度就为列数。
#include<iostream>
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;
}