1. 程式人生 > >UVA437矩形嵌套的立體版

UVA437矩形嵌套的立體版

要求 string 一個 ifdef size 需要 clu 探討 output

題目不說了,其實還是很簡單的,只需要再去處理一下如何表示頂點就可以了。

但這個裏面有一個值得探討的小細節,就是如果輸入的長方體有相同的邊,那麽在頂點裏面不就重復了嗎?

不過好在在這道題目中,有相同的點並沒有什麽影響,因為這兩個頂點之間根本不存在邊

還有一點就是,汝佳的代碼裏面沒有建圖,可以是可以,但是那樣的話,對編寫代碼的要求又提高了一些,但是時間效率並沒有差很多

下面附上AC代碼:

//這題思路很明確,對每一個長方體都都搞出三種不同的形態(最多),然後每一種形態代表一個頂點,最多有90個這樣的頂點(同一種形態的不可能使用兩次)
//然後對這些頂點構造有向圖
//最後就是求從每一個節點出發的可以構建的最大的高度
//需要仔細思考的地方在於 //使用set來構造這樣的集合,以防止出現同構的長方體 //其實同不同構無所謂 //忘了考慮需要嚴格大於!!!並不是面積大於 #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int maxn = 100; struct node { int x,y,h; }Node[maxn]; int n; int G[maxn][maxn]; int vis[maxn];
int d[maxn]; void print_G() { for(int i = 0;i < 3 * n;i++) { for(int j = 0;j < 3 * n;j++) { printf("%d ",G[i][j]); } printf("\n"); } } bool creat_G() { memset(vis,0,sizeof(vis)); memset(G,0,sizeof(G)); scanf("%d",&n);
if(!n) return false; for(int i = 0;i < n;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); Node[3 * i ].x = a; Node[3 * i ].y = b; Node[3 * i ].h = c; Node[3 * i + 1].x = a; Node[3 * i + 1].y = c; Node[3 * i + 1].h = b; Node[3 * i + 2].x = c; Node[3 * i + 2].y = b; Node[3 * i + 2].h = a; } for(int i = 0;i < 3 * n;i++) { for(int j = 0;j < 3 * n;j++) { //有向邊代表可以放到那一塊上 if((Node[i].x < Node[j].x && Node[i].y < Node[j].y )||(Node[i].x < Node[j].y && Node[i].y < Node[j].x )) { G[i][j] = 1; } } } //print_G(); return true; } int dp(int x) { if(vis[x]) return d[x]; vis[x] = 1; int ans = 0; for(int i = 0;i < 3 * n;i++) { if(G[x][i]) { ans = max(ans,dp(i)); } } ans = ans + Node[x].h; d[x] = ans; return d[x]; } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int kase = 0; while(creat_G()) { printf("Case %d: maximum height = ",++kase); int Max = 0; for(int i = 0;i < 3 * n;i++) { if(!vis[i]) { Max = max(dp(i),Max); } } printf("%d\n",Max); } return 0; }

UVA437矩形嵌套的立體版