本文共 1072 字,大约阅读时间需要 3 分钟。
题意:要让小的牌放到大的牌上面最少移动的距离。
思路:看成让大的牌放在小的牌上面了。。。用一个标记数组vis判断该点是否移动了。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 using namespace std;13 #define INF 0x3f3f3f3f14 typedef long long LL;15 int pos[15], vis[15], ans;16 17 void dfs(int u, int sum) {18 if(u == 10) { // 如果9张牌都动过了,就得到答案了19 ans = min(ans, sum); return ;20 }21 for(int i = 1; i <= 10; i++) {22 if(!vis[i]) { // 如果这张牌没动过23 vis[i] = 1; // 让他放到比它大的牌的上面24 for(int j = i + 1; j <= 10; j++) {25 if(!vis[j]) { // 如果这张牌没动过,那么可以放26 // 相当于把i这张牌放到j这张牌上面27 dfs(u + 1, sum + abs(pos[j] - pos[i]));28 break;29 }30 }31 vis[i] = 0;32 }33 }34 }35 36 int main() {37 int t;38 scanf("%d", &t);39 while(t--) {40 memset(vis, 0, sizeof(vis));41 int a; ans = INF;42 for(int i = 1; i <= 10; i++) scanf("%d", &a), pos[a] = i;43 dfs(1, 0);44 printf("%d\n", ans);45 }46 return 0;47 }
转载于:https://www.cnblogs.com/fightfordream/p/6384616.html