iscsi

SRM 437 D1 250

Jul 28th, 2011
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cctype>
  12. #include <cmath>
  13. using namespace std;
  14. typedef long long LL;
  15. #define FOR(k,a,b) for(int k(a); k < (b); ++k)
  16. #define REP(k,a) for(int k=0; k < (a); ++k)
  17.  
  18.  
  19. class TheSwap {
  20.     int mN, mIdx;
  21.     vector<int> digits;
  22.     vector<int> numbers;
  23.     bool ddigit(int n)
  24.     {
  25.         vector<int> d(10);
  26.         while(n)
  27.         {
  28.             ++d[n%10];
  29.             if(d[n%10]==2)
  30.                 return true;
  31.             n/=10;
  32.         }
  33.         return false;
  34.     }
  35.     bool isNeighboor(int a,int b)
  36.     {
  37.         if(a==b)
  38.             return ddigit(a);
  39.         int res=0;
  40.         while(a)
  41.         {
  42.             if(a%10!=b%10)
  43.                 ++res;
  44.             a/=10;b/=10;
  45.         }
  46.         return res==2;
  47.     }
  48. public:
  49.     int findMax(int n, int k) {
  50.         if(k==0)
  51.             return n;
  52.         mN=n;
  53.         mIdx=0;
  54.         int res=-1;
  55.         vector<int>  nums;
  56.         while(n)
  57.         {
  58.             digits.push_back(n%10);
  59.             n/=10;
  60.         }
  61.         sort(digits.begin(),digits.end());
  62.         do
  63.         {
  64.             int tmp=0;
  65.             if (digits[0])
  66.                 REP(i,digits.size())
  67.                 {
  68.                     tmp*=10;
  69.                     tmp+=digits[i];
  70.                 }
  71.             if(tmp==mN)
  72.                 mIdx=nums.size();
  73.             nums.push_back(tmp);
  74.         } while (next_permutation(digits.begin(),digits.end()));
  75.         vector<vector<int> > neighboor(nums.size(),nums.size());
  76.         REP(i,nums.size())
  77.         REP(j,nums.size())
  78.         {
  79.             neighboor[i][j]=(isNeighboor(nums[i],nums[j])?1:0);
  80.         }
  81.         vector<vector<int> > dist(k,vector<int> (nums.size()));
  82.         REP(i,nums.size())
  83.             dist[0][i]=neighboor[mIdx][i];
  84.         REP(tt,k-1)
  85.         {
  86.             REP(i,nums.size())
  87.                 if(dist[tt][i])
  88.                     REP(j,nums.size())
  89.                         if(neighboor[i][j])
  90.                             dist[tt+1][j]=1;
  91.         }
  92.         REP(i,nums.size())
  93.             if(dist[k-1][i] && nums[i]>res)
  94.                 res=nums[i];
  95.         return res;
  96.     }
  97. };
Advertisement
Add Comment
Please, Sign In to add comment