AtCoder Regular Contest 080-D

来源:互联网 发布:泉州电视台直播软件 编辑:程序博客网 时间:2024/05/17 06:50

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 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.

Constraints
1≤H,W≤100
1≤N≤HW
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
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
Sample Input 3
1 1
1
1
Sample Output 3
1

题目大意: hw的方格,涂上1~n的颜色,第i中颜色途ai个,保证相同颜色连通,输出一种涂色方法。
解题思路:走S形
注意点:输出之间有空格,开始没注意/(ㄒoㄒ)/~~

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<set>using namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const int MAXN=1e5+5;int a[MAXN];int G[105][105];int main(){    int h,w;    while(scanf("%d%d",&h,&w)!=EOF)    {        int n;        scanf("%d",&n);        for(int i=1;i<=n;++i)            scanf("%d",&a[i]);        int cnt=1;        for(int i=1;i<=h;++i)        {            if(i&1)            {                for(int j=1;j<=w;++j)                {                   if(a[cnt]>0) {G[i][j]=cnt;--a[cnt];}                   else if(a[cnt]==0) {++cnt;G[i][j]=cnt;--a[cnt];}                }            }else            {                for(int j=w;j>=1;--j)                {                    if(a[cnt]>0) {G[i][j]=cnt;--a[cnt];}                    else if(a[cnt]==0) {++cnt;G[i][j]=cnt;--a[cnt];}                }            }        }        for(int i=1;i<=h;++i)        {            for(int j=1;j<=w;++j)            {                if(j!=w) printf("%d ",G[i][j]);                else printf("%d\n",G[i][j]);            }        }    }    return 0;}
原创粉丝点击