wap 机试 旅行家问题

来源:互联网 发布:淘宝今年双十一销售额 编辑:程序博客网 时间:2024/05/16 19:20
#include <iostream>#include <queue>#include <assert.h>#include <string>#include <algorithm>#include <fstream>#include <map>#include <math.h>#define MAXFLOAT 10000000using namespace std;const int dx[] = { -1 , 0 , 0, 1};const int dy[] = { 0 ,-1 ,1 , 0 }; //4 directionstruct Point{Point(){};Point(int x,int y):m_x(x),m_y(y){}int m_x;int m_y;bool operator == (const Point & rPoint ){return rPoint.m_x == m_x && rPoint.m_y == m_y;}};class Orienteering{public: int main();bool isValid(const Point & p){bool ans = p.m_x >=0 && p.m_x < cMap.size() && p.m_y >= 0 && p.m_y < cMap[0].size() && cMap[p.m_x][p.m_y] != '#' ;return ans;}bool findG(const Point &cPoint,const Point &ePoint){for(int i = 0 ; i < 4 ; i ++ ){Point p(cPoint.m_x + dx[i] , cPoint.m_y + dy[i]);if(isValid(p) && !bVisited[p.m_x][p.m_y] && p == ePoint){return true;  // 只考虑一个}if(isValid(p) && ! bVisited[p.m_x][p.m_y]){Qtemp.push(p);bVisited[p.m_x][p.m_y] = true;}}return false;}void ClearQueue(queue<Point> &Q){while(!Q.empty()){Q.pop();}}void ResetVisted(){for(int i = 0 ; i < bVisited.size() ; i ++)for(int j = 0 ; j < bVisited[0].size() ; j ++ )bVisited[i][j] = false;}int findShortest(const Point & sPoint,const Point &ePoint){ResetVisted();ClearQueue(Qin);ClearQueue(Qtemp);shortestCount = 0;Qin.push(sPoint);bVisited[sPoint.m_x][sPoint.m_y] = true;while (true){while(!Qin.empty()){Point cur = Qin.front();if(findG(cur,ePoint)){shortestCount += 1;return shortestCount;}Qin.pop();}if(Qtemp.empty())return -1;// no way toelse{shortestCount += 1; swap(Qtemp,Qin);}}return -1;}void permutation(vector<vector<int>> & perms,int *a,int n,int k){if(k == n){vector<int> temp(a,a+n);perms.push_back(temp);return;}for(int i = k; i < n ; i ++ ){swap(a[i],a[k]);permutation(perms,a,n,k+1);swap(a[i],a[k]);}}void readFile(string & filePath,vector<string> &cMpas){ifstream in(filePath);if(!in.is_open())return;string line;getline(in,line);sscanf(line.c_str(),"%d %d",&m,&n);for(int i = 0 ; i < m ; i ++ ){getline(in,line);cMpas.emplace_back(line);}}int m,n;int shortestCount;vector<vector<bool>> bVisited;queue<Point> Qin;queue<Point> Qtemp;vector<string> cMap;};int Orienteering::main(){/*int mapBackup[M][N];memcpy(mapBackup,path,sizeof(path)/sizeof(int));*/string filePath = "example1.txt";readFile(filePath,cMap);bVisited.resize(m,vector<bool>(n,false));vector<Point> ats;Point pStart;Point pEnd;for(int i = 0 ; i < m ; i ++ ){for(int j = 0 ; j < n ; j ++ ){if(cMap[i][j] == '@')ats.push_back(Point(i,j));if(cMap[i][j] == 'S')pStart = Point(i,j);if(cMap[i][j] == 'G')pEnd = Point(i,j);}}int gNums = ats.size();int *arrayNums = new int[gNums]; for(int i = 0 ; i < gNums ; ++ i)arrayNums[i] = i;vector<vector<int>> perms;permutation(perms,arrayNums,gNums,0);int minLen = 100000;for(int i = 0 ; i < perms.size() ; i ++ ){int totalLen = 0;Point endP = ats[perms[i][0]];int len = findShortest(pStart,endP);if(len ==-1)return -1;totalLen += len;for(int j = 0 ; j < perms[i].size() -1 ; j ++ ){Point startPoint = ats[perms[i][j]];Point endPoint = ats[perms[i][j + 1]];int len = findShortest(startPoint,endPoint);if(len == -1)return -1;totalLen += len;}len = findShortest(ats[perms[i][perms[i].size()-1]],pEnd);if(len == -1)return -1;totalLen += len;minLen = min(totalLen,minLen);}delete[] arrayNums;return minLen;}float dist(Point & lhs,Point &rhs){return sqrt( float(pow(float(lhs.m_x - rhs.m_x),2)+pow(float(lhs.m_y - rhs.m_y),2)));}int getBit(int i){int ans = 0;for(int j = 0 ; j < i ;j ++)ans |= (1 <<j) ;return ans;}vector<int> getSubSets(int m,int n);void bitSetToVec(int bitSet,vector<int>& vec){for(int i = 0 ; i < 32 ;i ++){if(bitSet >> i & 1)vec.push_back(i);}}vector<int> getVectorForBitSet(int bitSet){vector<int> ans;for(int i = 0 ; i < 32 ; i ++){if(1 << i & bitSet)ans.push_back(i);}return ans;}float held_karp(Point &startPoint, vector<Point> & points, Point& endPoint ){map<int,float> M;  //  map<S,int>int len = points.size();for(int i = 0; i < len ; i ++){int selected = 1 << i ;           M[selected] = dist(startPoint,points[i]);}int setNum = pow(float(2),len);vector<vector<float>> dp(setNum,vector<float>(len,0));for(int i = 0;i < len ; i ++){int selected = 1 << i ; dp[selected][i] = dist(startPoint,points[i]);}for(int i = 2 ; i <= len; i ++)  //s length{vector<int> subSets = getSubSets(len,i);for(int s = 0; s < subSets.size() ; s ++ ){int bitSet = subSets[s];vector<int> indexs ;bitSetToVec(bitSet,indexs);for(auto j = indexs.begin() ; j != indexs.end() ; j ++ ){int ex = 1 << *j ;int exludeJ = bitSet ^ ex ;    // exclude jfloat minLen = MAXFOALT;for(int k = 0 ; k < len ; k ++){if( exludeJ >> k &1 ){dp[bitSet][*j] = min(dp[exludeJ][k]+dist(points[*j],points[k] ),minLen);}}}}}int lastBitSet = 0 ;  for(int i = 0 ; i < len ; i ++ ){lastBitSet |= (1 << i );}float minLen = MAXFLOAT;for(int k = 0 ; k <len ; k ++){   minLen = min(dp[lastBitSet][k]+dist(endPoint,points[k] ),minLen);}float ans = minLen;return ans;}void test(){vector <Point> points;Point pStart(1,0);points.push_back(Point(1,1));points.push_back(Point(1,2));points.push_back(Point(2,1));Point pEnd(3,1);float ans = held_karp(pStart,points,pEnd);}void combination(vector<vector<int>>& ans,vector<bool> & bVisited, int m,int n,int start ){if(n == 0 ){vector<int> oneAns;for(int i = 0 ; i < m ; i ++){if(bVisited[i] == true)oneAns.push_back(i);}ans.push_back(oneAns);return;}if(start >= m){return ;}bVisited[start] =true;combination(ans,bVisited,m,n-1,start +1);bVisited[start] = false;combination(ans,bVisited,m,n,start +1);}vector<int> getSubSets(int m,int n){vector<vector<int>> coms;vector<bool> bVisited(m,false);combination(coms,bVisited,m,n,0);vector<int> ans;for(int i = 0 ; i < coms.size() ; i ++){int bitSelected = 0;for( int j = 0 ; j < coms[i].size() ; j ++){bitSelected |= 1 << coms[i][j];}ans.push_back(bitSelected);}return ans;}//void search(vector<vector<int> > &ans, vector<int> & temp, int n, int last, int step, int k) {  //        if (step == k) {  //            ans.push_back(temp);  //            return;  //        }  //        for (int i = last + 1; i <= n; i++) {  //            temp.push_back(i);  //            search(ans, temp, n, i, step + 1, k);  //            temp.pop_back();  //        }  //    } ////vector<vector<int>> com(int m,int n){  //        vector<vector<int>> ans;  //        vector<int> temp;  //        search(ans, temp, m, 0, 0, n);// return ans;//}int main(){test();//Orienteering o;//int ans = o.main();system("pause");return 0;}

0 0
原创粉丝点击