Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <vector>
- #include <queue>
- #include <set>
- #include <map>
- #include <cstdio>
- #include <cstdlib>
- #include <cctype>
- #include <cmath>
- using namespace std;
- typedef long long LL;
- #define FOR(k,a,b) for(int k(a); k < (b); ++k)
- #define REP(k,a) for(int k=0; k < (a); ++k)
- class TheSwap {
- int mN, mIdx;
- vector<int> digits;
- vector<int> numbers;
- bool ddigit(int n)
- {
- vector<int> d(10);
- while(n)
- {
- ++d[n%10];
- if(d[n%10]==2)
- return true;
- n/=10;
- }
- return false;
- }
- bool isNeighboor(int a,int b)
- {
- if(a==b)
- return ddigit(a);
- int res=0;
- while(a)
- {
- if(a%10!=b%10)
- ++res;
- a/=10;b/=10;
- }
- return res==2;
- }
- public:
- int findMax(int n, int k) {
- if(k==0)
- return n;
- mN=n;
- mIdx=0;
- int res=-1;
- vector<int> nums;
- while(n)
- {
- digits.push_back(n%10);
- n/=10;
- }
- sort(digits.begin(),digits.end());
- do
- {
- int tmp=0;
- if (digits[0])
- REP(i,digits.size())
- {
- tmp*=10;
- tmp+=digits[i];
- }
- if(tmp==mN)
- mIdx=nums.size();
- nums.push_back(tmp);
- } while (next_permutation(digits.begin(),digits.end()));
- vector<vector<int> > neighboor(nums.size(),nums.size());
- REP(i,nums.size())
- REP(j,nums.size())
- {
- neighboor[i][j]=(isNeighboor(nums[i],nums[j])?1:0);
- }
- vector<vector<int> > dist(k,vector<int> (nums.size()));
- REP(i,nums.size())
- dist[0][i]=neighboor[mIdx][i];
- REP(tt,k-1)
- {
- REP(i,nums.size())
- if(dist[tt][i])
- REP(j,nums.size())
- if(neighboor[i][j])
- dist[tt+1][j]=1;
- }
- REP(i,nums.size())
- if(dist[k-1][i] && nums[i]>res)
- res=nums[i];
- return res;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment