#include <iostream>#include <queue>#include <assert.h>#include <string>#include <algorithm>#include <fstream>using 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;}int main(){Orienteering o;int ans = o.main();system("pause");return 0;}
WAP Server trial (LSP) problem violence law