• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LyonLys
愿意在角落唱沙哑的歌 再大声也都是给你 请用心听 不要说话 Contact me via E-mail: lyon.lys@gmail.com
博客园    首页    新随笔    联系   管理    订阅  订阅

hdu 1195 Open the Lock

Problem - 1195

  一个全排列的搜索题,开始的时候看错题,没发觉是两个相邻的数才可以交换。计算交换次数可以用冒泡排序来模拟,从而算两个状态间要多少次交换才能达到。

代码如下:

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 #define REP(i, n) for (int i = 0; i < (n); i++)
 9 #define REP_1(i, n) for (int i = 1; i <= (n); i++)
10 #define INC(i, a, b) for (int i = (a); i <= (b); i++)
11 #define DEC(i, a, b) for (int i = (a); i >= (b); i--)
12 #define _clr(x) memset(x, 0, sizeof(x))
13 
14 template <class T> T sqr(T x) {
15     return x * x;
16 }
17 typedef long long LL;
18 const int N = 1e5 + 100;
19 const LL linf = 0x5555555555555555ll;
20 const int inf = 0x55555555;
21 
22 int arr[5], best;
23 char str[2][6];
24 
25 int diff(char a, char b) {
26     int d = max(a, b) - min(a, b);
27     return min(d, 9 - d);
28 }
29 
30 int cal() {
31     int ret = 0;
32     REP(i, 4) ret += diff(str[0][arr[i]], str[1][i]);
33     return ret;
34 }
35 
36 int cal(int *a) {
37     int tmp[4];
38     REP(i, 4) tmp[i] = a[i];
39     int ret = 0;
40     bool chg = true;
41     while (chg) {
42         chg = false;
43         REP(i, 3) {
44             if (tmp[i] > tmp[i + 1]) { swap(tmp[i], tmp[i + 1]); chg = true; ret++;}
45         }
46     }
47     return ret;
48 }
49 
50 void dfs(int l, int r) {
51     if (l == r) {
52         best = min(best, cal() + cal(arr));
53         return ;
54     }
55     INC(i, l, r) {
56         swap(arr[i], arr[l]);
57         dfs(l + 1, r);
58         swap(arr[i], arr[l]);
59     }
60 }
61 
62 int main() {
63 //    freopen("in", "r", stdin);
64     int T;
65     cin >> T;
66     while (T--) {
67         REP(i, 2) cin >> str[i];
68         REP(i, 4) arr[i] = i;
69         best = inf;
70         dfs(0, 3);
71         cout << best << endl;
72     }
73     return 0;
74 }

 

——written by Lyon

 

 

 

posted @ 2013-03-27 01:08  LyonLys  阅读(137)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3