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
#include <cstdio>
#include <iostream>
using namespace std;
int pd[110][110];
int main(){
int h,w,n,x=0;
cin>>h>>w>>n;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
for(int j=0;j<a[i];j++){
if((x/w)%2==0) pd[x/w][x%w]=i+1;
else pd[x/w][w-(x%w)-1]=i+1;
x++;
}
}
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
if(j==w-1) printf("%d\n",pd[i][j]);
else printf("%d ",pd[i][j]);
}
}
return 0;
}
雖然這次還是沒有做出來,可是爲了最後一題做Beginner好蠢,下次決定要開始做下個級別的了。