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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值