DFS深度优先搜索案例:马戏团叠罗汉

转载自:http://blog.csdn.net/arhaiyun/article/details/11983913

2012创新工场校园招聘的一道编程算法题:马戏团里有个叠罗汉的表演,为了便于美观,下面的人身高和体重都要大于上面的人。现在知道n个演员的身高和体重,请问最多能叠多少层?

设计思路:

首先生成一个有向图map,用连接矩阵的方式来表示。map[i][j]==1表示第i个人上面可以放第j个人。然后开始对每个人进行dfs深度搜索,这个图中不可能有环。所以对于每个人来说就是一棵树,搜索树的高度。再找出最高的高度即是答案。

 

[cpp]  view plain copy
  1. /* 
  2. * DieLuoHan.cpp 
  3. * 马戏团里有个叠罗汉的表演,为了便于美观,下面的人身高和体重都要大于上面的人。 
  4. * 现在知道n个演员的身高和体重,请问最多能叠多少层? 
  5. * @author arhaiyun 
  6. * Date: 2013/09/24 
  7. **/  
  8.   
  9. #include "stdafx.h"  
  10. #include <iostream>  
  11. #include <vector>  
  12. #include <fstream>  
  13. #include <cstdlib>  
  14. #include <time.h>  
  15.   
  16. using namespace std;  
  17.   
  18. double* weight;  
  19. double* height;  
  20.   
  21. int** map;  
  22. int n;  
  23.   
  24. int maxDepth;  
  25. vector<int> bestPath;  
  26.   
  27. int dfs(int index, vector<int> &path)  
  28. {  
  29.     int flag = 0; // 是否有人可以站在index上  
  30.     int depth = 0;  
  31.       
  32.     for(int i = 0; i < n; i++)     
  33.     {  
  34.         if(map[index][i] == 1)  
  35.         {  
  36.             flag = 1;  
  37.             vector<int> tPath;  
  38.             int tDepth = dfs(i, tPath);  
  39.               
  40.             if(tDepth > depth)  
  41.             {  
  42.                 path = tPath;  
  43.                 depth = tDepth;  
  44.             }  
  45.         }  
  46.     }  
  47.       
  48.     if(flag == 0)  
  49.     {  
  50.         path.clear();  
  51.         path.push_back(index);  
  52.         return 1;  
  53.     }  
  54.       
  55.     path.push_back(index);  
  56.     return depth + 1;  
  57. }  
  58.   
  59. void GenerateData(void)  
  60. {  
  61.     ofstream out("in.txt");  
  62.     n = 30;  
  63.     out<<n<<endl;  
  64.       
  65.     srand(time(0));  
  66.       
  67.     for(int i = 0; i < n; i++)  
  68.     {  
  69.         out<<rand()%50 + 50<<" ";  
  70.         out<<rand()%50 + 150<<endl;  
  71.     }  
  72. }  
  73.   
  74. void GenerateMap()  
  75. {  
  76.     map = new int*[n];  
  77.       
  78.     for(int i = 0; i < n; i++)  
  79.     {  
  80.         map[i] = new int[n];  
  81.         memset(map[i], 0, sizeof(map[i]));  
  82.     }  
  83.       
  84.     for(int i = 0; i < n; i++)  
  85.     {  
  86.         for(int j = 0; j < n; j++)  
  87.         {  
  88.             //map[i][j] = 1表示j可以放站在i上  
  89.             if(weight[i] > weight[j] && height[i] > height[j])  
  90.             {  
  91.                 map[i][j] = 1;  
  92.             }  
  93.         }  
  94.     }  
  95. }  
  96.   
  97. void PrintData(void)  
  98. {  
  99.     cout<<"weight\theight"<<endl;  
  100.     for(int i = 0; i < n; i++)  
  101.     {  
  102.         cout<<weight[i]<<"\t"<<height[i]<<endl;  
  103.     }  
  104. }  
  105.   
  106.   
  107. int main(void)  
  108. {  
  109.     GenerateData();  
  110.     //fstream input("in.txt", ios::in);  
  111.     freopen("in.txt""r", stdin);  
  112.       
  113.     cin>>n;  
  114.     weight = new double[n];  
  115.     height = new double[n];  
  116.       
  117.     for(int i = 0; i < n; i++)     
  118.     {  
  119.         cin>>weight[i]>>height[i];  
  120.     }  
  121.   
  122.     PrintData();  
  123.     GenerateMap();  
  124.       
  125.     int depth = 0;  
  126.       
  127.     for(int i = 0; i < n; i++)  
  128.     {  
  129.         vector<int> tPath;  
  130.           
  131.         int tDepth = dfs(i, tPath);  
  132.         if(tDepth > depth)  
  133.         {  
  134.             bestPath = tPath;  
  135.             depth = tDepth;  
  136.         }  
  137.     }  
  138.       
  139.     cout<<"Max layers:"<<depth<<endl;  
  140.       
  141.     for(int i = 0; i < (int)bestPath.size(); i++)  
  142.     {  
  143.         cout<<height[bestPath[i]]<<" "<<weight[bestPath[i]]<<endl;  
  144.     }  
  145.   
  146.     for(int i = 0; i < n; i++)  
  147.     {  
  148.         delete[] map[i];  
  149.     }  
  150.     delete[] map;  
  151.   
  152.     delete[] weight;  
  153.     delete[] height;  
  154.   
  155.     system("pause");  
  156.     return 0;  
  157. }  

你可能感兴趣的:(DFS深度优先搜索案例:马戏团叠罗汉)