新的一周 / 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 }
时间: 2024-10-24 04:28:31