Advertisement
XuanHong

qui hoạch động cơ bản: Tìm đường cho nhà khảo cổ...

Feb 3rd, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. // bài toán áp dụng qui hoạch động (mức cơ bản): Tìm đường cho nhà khảo cổ sao cho số đồ vật khai quật được là nhiều nhất,
  2. // biết tại mỗi chỗ đứng nhà khảo cổ chỉ có 3 lựa chọn sau:
  3. // 1 là hướng đông, 2 là hướng đông bắc, 3 là hướng đông nam
  4. // input dòng đầu là số dòng (số cột) của ma trận, n dòng sau thể hiện ma trận,
  5. // ô số 0 nghĩa là những nơi không thể tới,
  6. // cột đầu tiên có duy nhất 1 ô giá trị 1 cho biết Start, (còn lại là 0)
  7. // (những ô khác trên ma trận ngoại trừ 0 đều mang giá trị dương vì thể hiện số đồ vật được khai quật)
  8. // output: vị trí bước đi của nhà khảo cổ
  9.  
  10. #include <iostream>
  11. #include <iomanip>
  12. #include <fstream>
  13. #include <stack>
  14. using namespace std;
  15.  
  16. int n=0;
  17. int a[100][100];
  18. int b[100][100];
  19.  
  20. int max3so(int x, int y, int z)
  21. {  
  22.     int max1;
  23.     if(x>y)
  24.         max1=x;
  25.     else
  26.         max1=y;
  27.     if(max1>z)
  28.         return max1;
  29.     else
  30.         return z;
  31. }
  32.  
  33. void main()
  34. {
  35.     ifstream fin;
  36.     fin.open("input.txt");
  37.     fin>>n;
  38.     for(int i=0; i<n; i++)
  39.     {
  40.         a[n+1][i]=0;
  41.         a[0][i]=0;
  42.         b[n+1][i]=0;
  43.         b[0][i]=0;
  44.     }
  45.     int i=0;
  46.     int j=0;
  47.     for(i=1; i<=n; i++)
  48.     {
  49.         for(j=0; j<n; j++)
  50.         {
  51.             {
  52.                 fin>>a[i][j];
  53.                 b[i][j]=a[i][j];
  54.             }
  55.         }
  56.     }
  57.  
  58.     for(j=1; j< n; j++)
  59.     {
  60.         for(i=1; i<=n; i++)
  61.         {
  62.             {
  63.                 b[i][j]=max3so(b[i-1][j-1]+b[i][j],b[i+1][j-1]+b[i][j],b[i][j-1]+b[i][j]);
  64.             }
  65.         }
  66.     }
  67.  
  68.     int max=0;
  69.     for(i=1; i<=n; i++)
  70.     {
  71.         {
  72.             if(b[i][n-1]>max)
  73.                 max=b[i][n-1];
  74.         }
  75.     }
  76.  
  77.     int k1 ;
  78.     int k2 ;
  79.     stack<int> st;
  80.  
  81.     for(i=1; i<=n; i++)
  82.     {
  83.         {
  84.             if(b[i][n-1]==max)
  85.             {
  86.                 //cout<<"("<<i-1<<","<<n-1<<")"<<endl;
  87.                 st.push(n-1);
  88.                 st.push(i-1);
  89.                 k1 = i;
  90.                 k2 = n-1;
  91.                 break;
  92.             }
  93.         }
  94.     }
  95.    
  96.     int dem =0;
  97.     while(dem!=n-1)
  98.     {
  99.         max-=a[k1][k2];
  100.         for( i=1; i<=n; i++)
  101.         {
  102.             if((b[i][k2-1]==max)&&(i-1==k1||i+1==k1||i==k1))
  103.             {
  104.                 //cout<<"("<<i-1<<","<<k2-1<<")"<<endl;
  105.                 st.push(k2-1);
  106.                 st.push(i-1);
  107.                 k2--;
  108.                 k1=i;
  109.                 dem++;
  110.                 break;             
  111.             }
  112.         }
  113.     }
  114.  
  115.     dem=0;
  116.     while(!st.empty())
  117.     {
  118.         if(dem%2==0&&dem!=0)
  119.             cout<<endl;
  120.         cout<< st.top()<<" ";
  121.         st.pop();
  122.         dem++;
  123.     }
  124.     cout<<endl;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement