POJ 3802 Cubist Artwork 模拟了下填数过程

这个不能算答案,如果是比赛,这么模拟肯定玩完。

纯粹是想借POJ验证下这个填数过程……

题意:给出网格的宽高,主视图每列的最大高度、侧视图每行的最大高度,求满足主侧视图的最少的方块个数。

 

  1 #include<iostream>
2 #include<queue>
3 #include<memory.h>
4 using namespace std;
5
6 int matrix[15][15];
7 int colVal[15], rowVal[15];
8 queue<int> qCol, qRow;
9
10 int main()
11 {
12 int w, d;
13 while(cin>>w>>d)
14 {
15 int sum = 0;
16 if(w == 0 && d == 0) break;
17 memset(matrix, 0, sizeof(matrix));
18 memset(colVal, 0, sizeof(colVal));
19 memset(rowVal, 0, sizeof(rowVal));
20
21 /////////////////////// 输入数据,对应每行每列的最大高度 ////////////////////
22 for(int i = 1; i <= w; i++)
23 {
24 cin>>matrix[0][i];
25 }
26 for(int i = 1; i <= d; i++)
27 {
28 cin>>matrix[i][0];
29 }
30
31 //////////////// 检查与行(列)最大高度相等的列(行) ////////////////
32 for(int i = 1; i <= d; i++)
33 {
34 for(int j = 1; j <= w; j++)
35 {
36 if(matrix[i][0] == matrix[0][j] && colVal[j] == 0)
37 {
38 matrix[i][j] = matrix[i][0];
39 colVal[j] = matrix[i][j];
40 sum += matrix[i][j];
41 break;
42 }
43 }
44 }
45
46 ///////////////// 检出所有行(列)最大高度小于要求高度的行(列) //////////////
47 for(int i = 1; i <= w; i++)
48 {
49 int max = 0;
50 for(int j = 1; j <= d; j++)
51 {
52 if(matrix[j][i] > max)
53 max = matrix[j][i];
54 }
55 colVal[i] = max;
56 if(colVal[i] < matrix[0][i])
57 qCol.push(i);
58 }
59 for(int i = 1; i <= d; i++)
60 {
61 int max = 0;
62 for(int j = 1; j <= w; j++)
63 {
64 if(matrix[i][j] > max)
65 max = matrix[i][j];
66 }
67 rowVal[i] = max;
68 if(rowVal[i] < matrix[i][0])
69 qRow.push(i);
70 }
71
72 ////////////// 处理剩下的仍不符合要求的行和列,填空 ////////////
73 while(!qCol.empty())
74 {
75 int col = qCol.front(), val = matrix[0][col];
76 for(int i = 1; i <= d; i++)
77 {
78 if(val <= matrix[i][0] && matrix[i][col] == 0)
79 {
80 matrix[i][col] = val;
81 sum += val;
82 break;
83 }
84 }
85 qCol.pop();
86 }
87 while(!qRow.empty())
88 {
89 int row = qRow.front(), val = matrix[row][0];
90 for(int i = 1; i <= w; i++)
91 {
92 if(val <= matrix[0][i] && matrix[row][i] == 0)
93 {
94 matrix[row][i] = val;
95 sum += val;
96 break;
97 }
98 }
99 qRow.pop();
100 }
101
102 printf("%d\n", sum);
103 }
104 return 0;
105 }

 

顺便提一下,用数学方法这道题是很简单的

posted @ 2012-02-14 19:57  dgsrz  阅读(255)  评论(0编辑  收藏  举报