码迷,mamicode.com
首页 > 其他好文 > 详细

第十四周 5.30 --- 6.5

时间:2016-05-31 20:46:03      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

新的一周 / w \

 

大家都在图书馆看书..我在图书馆睡觉...

 

5.31

做cf 碰到一道 bfs 的题,想起这题还没有补

hiho 1233 Boxes

去年一神就教过我...可是又不会了..

还是状态的表示没有想清楚,是每一个块的权值 乘以 位置的编号 表示一个状态

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 
 8 typedef pair<int,int> pii;
 9 const int maxn = 1e6+5;
10 int ans[8][maxn],box[8];
11 int val[8];
12 int dx[2] = {-1,1};
13 
14 struct node{
15     int v,id;
16     friend bool operator < (node n1,node n2){
17         return n1.v < n2.v;
18     }
19 }V[8];
20 
21 int get(int n){
22     sort(V,V+n);
23     int ret = 0;
24     for(int i = 0;i < n;i++) ret += V[i].id * val[i+1];
25     return ret;
26 }
27 
28 void rget(int cur){
29     memset(box,0,sizeof(box));
30     for(int i = 7;i;i--){
31         int id = cur/val[i];
32         box[id] = i;
33         cur = cur%val[i];
34     }
35 }
36 
37 void Pro(){
38     memset(ans,-1,sizeof(ans));
39     for(int n = 1;n <= 7;n++){
40         int cur = 0,t = 0;
41         for(int i = 0;i < n;i++) cur += i*val[i+1];
42         queue<pii> q;
43         q.push(pii(cur,0));
44         ans[n][cur] = 0;
45         while(!q.empty()){
46             pii tmp = q.front();q.pop();
47             cur = tmp.first;t = tmp.second;
48             rget(cur);
49             for(int i=0;i<n;i++){
50                 if(!box[i]) continue;
51                 for(int k = 0;k < 2;k++){
52                     int pos = i+dx[k];
53                     if(pos < 0 || pos >= n) continue;
54                     if(!box[pos]||box[i] < box[pos]){
55                         int Next=cur-i*val[box[i]]+pos*val[box[i]];
56                         if(ans[n][Next]<0) {
57                             ans[n][Next]=t+1; q.push(pii(Next,t+1));
58                         }
59                     }
60                 }
61             }
62         }
63     }
64 }
65 
66 int main(){
67     val[0] = 0;val[1] = 1;
68     for(int i = 2;i <= 7;i++) val[i] = val[i-1]*7;
69     Pro();
70     int T;
71     scanf("%d",&T);
72     while(T--){
73         int n;
74         scanf("%d",&n);
75         for(int i = 0;i < n;i++){
76             scanf("%d",&V[i].v);
77             V[i].id = i;
78         }
79         int cur = get(n);
80         printf("%d\n",ans[n][cur]);
81 
82     }
83     return 0;
84 }
View Code

 

第十四周 5.30 --- 6.5

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/5547103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!