題意:一個規則的實心十二面體,它的 20個頂點標出世界著名的20個城市,你從一個城市出發通過每一個城市恰好一次後回到出發的城市。 node
思路:dfs和回溯,算一個基礎題吧,這裏須要鄰接矩陣,用bool就能夠,也能夠用vector,數據小,就用前者了ios
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <queue> 5 #include <vector> 6 #include <string> 7 8 using namespace std; 9 10 #define inf (1LL << 31) - 1 11 #define rep(i,j,k) for(int i = j; i <= (k); i++) 12 #define rep__(i,j,k) for(int i = j; i < (k); i++) 13 #define per___(i,j,k) for(int i = j; i > (k); i--) 14 #define per(i,j,k) for(int i = j; i >= (k); i--) 15 16 const int N = 30; 17 bool mp[N][N]; //鄰接矩陣 18 int in; 19 bool vis[N]; //記錄拜訪過的城市,每一個dfs的分支都須要一次初始化 20 int ans; 21 22 struct node{ 23 int way[N]; //記錄路線 24 int l; //長度 25 node(int a = 0){ l = a; } 26 }; 27 28 void input(){ 29 30 memset(mp, false, sizeof(mp)); 31 int a, b, c; 32 rep(i, 1, 20){ 33 cin >> a >> b >> c; 34 mp[i][a] = mp[i][b] = mp[i][c] = true; //能到達的爲true 35 } 36 } 37 38 void dfs(int now,node& rec){ 39 40 //拜訪了全部的城市 41 if (rec.l == 20){ 42 43 //拜訪的最後一個城市能不能回到初始城市 44 if (!mp[now][in]) return; 45 46 //能夠,輸出答案 47 cout << (++ans) << ": "; 48 rep__(i, 0, rec.l) cout << " " << rec.way[i]; 49 cout << " " << in << endl; 50 return; 51 } 52 53 rep(i, 1, 20){ 54 55 //從小到大遍歷城市編號,解決了字典序 56 //能到,沒被拜訪過 57 if (mp[now][i] == true && !vis[i]){ 58 vis[i] = true; 59 rec.way[rec.l++] = i; 60 dfs(i, rec); 61 vis[i] = false;//(1) 62 rec.l--; //(2) (1)(2) 回溯 63 } 64 } 65 } 66 67 int main(){ 68 69 input(); 70 71 node rec; 72 73 while (cin >> in && in != 0){ 74 75 rec.way[rec.l++] = in; //記錄開始的城市 76 vis[in] = true; //標記已經拜訪過的城市 77 ans = 0; 78 79 dfs(in,rec); 80 81 rec.l = 0; //(1) 82 vis[in] = false; //(2) (1)(2)回溯 83 } 84 85 return 0; 86 }
,直接看代碼吧,寫的比較詳細spa