2020-07-06 熱身訓練賽(六)

A.Rush Hour Puzzle


題意:A是有個6*6的格子,裏面有1*3的火車和1*2的小汽車,他們不能拐彎,讓着通過移動這些小車,把編號爲1的小汽車從(3,6)這個格子移出去,問能否在10步之內移動出去,輸出步數或者-1。

解:這個題想的是迭代加深搜索,結果寫的是個普通搜索,原因是寫着寫着忘了😥,不過沒多大問題,因爲寫完之後運行了十多秒,就加了幾個剪枝,運行的時候總出小問題,就改了好久,感覺自己代碼寫的超囉嗦。

有兩種-1的情況可以直接判斷,一是編號爲1的小車不在第三行,二是編號爲1的小車的右側有橫向行駛的小車,這兩種情況直接輸出-1即可。

在迭代加深搜索時,判斷狀態我用的結構體,存儲每個車的左或上端點,那麼每次移動的時候,就看一下當前要移動的節點移動後的位置是否與爺爺狀態的這個節點的位置相同,如果相同,那就相當於往返移動了一次,就可以不用移動。因此搜索時需要傳遞兩個狀態:父親狀態和爺爺狀態。

剪枝:1.小紅車右面沒有任何障礙的時候,判斷直接移動出去的步數是否大於10,然後更新答案,return

2.如果當前位置直接移動出去的步數加上已經走過的步數大於10,就不必再搜索

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<map>
  5 using namespace std;
  6 int a[7][7],n,ans=0x7fffffff;
  7 
  8 struct node{
  9     int x,y;
 10     int len;
 11     bool ang;//0橫着.1豎着 
 12     bool operator != (const node &u)const{
 13         if(x!=u.x||y!=u.y)return 1;
 14         return 0;
 15     }
 16 }car[20];
 17 
 18 struct State{
 19     node w[20];
 20     bool operator != (const State &u)const{
 21         for(int i=1;i<=n;i++){
 22             if(w[i]!=u.w[i])return 1;
 23         }
 24         return 0;
 25     }
 26 };
 27 
 28 node make_node(int x,int y,int len,bool ang){
 29     node res;
 30     res.x=x;res.y=y;res.len=len;res.ang=ang;
 31     return res;
 32 }
 33 
 34 State make_sta(const node *c){
 35     State res;
 36     for(int i=1;i<=n;i++){
 37         res.w[i]=c[i];
 38     }
 39     return res;
 40 } 
 41 
 42 bool Judge(const State u){
 43     if(u.w[1].x==3&&u.w[1].y==5)
 44         return 1;
 45     return 0;
 46 }
 47 
 48 bool check(int x,int y,const State &u){
 49     for(int i=1;i<=n;i++){
 50         if(!u.w[i].ang && u.w[i].x==x && u.w[i].y<=y && u.w[i].y+u.w[i].len-1>=y)
 51             return 0;
 52         if(u.w[i].ang  && u.w[i].y==y && u.w[i].x<=x && u.w[i].x+u.w[i].len-1>=x)
 53             return 0;
 54     }
 55     return 1;
 56 }
 57 
 58 void dfs(int deep,const State &fa,const State &prefa){
 59     if(Judge(fa)){
 60         ans=min(ans,deep+1);
 61         return;
 62     }
 63     if((7-fa.w[1].y)>10-deep+1)return;
 64     bool flag=0;
 65     for(int i=2;i<=n;i++){
 66         if(!fa.w[i].ang&&fa.w[i].y>fa.w[1].y){
 67             flag=1;
 68             break;
 69         }
 70         if(fa.w[i].ang && fa.w[i].y>=fa.w[1].y+2 && fa.w[i].x<=3 && fa.w[i].x+fa.w[i].len-1>=3){
 71             flag=1;
 72             break;
 73         }
 74     }
 75     if(!flag){
 76         ans=min(ans,deep-1+7-fa.w[1].y);
 77         return;
 78     }
 79     if(deep==9){
 80         return;
 81     }
 82     State now=make_sta(fa.w);
 83     for(int i=1;i<=n;i++){
 84         node u=now.w[i];
 85         if(!u.ang&&(u.y+u.len-1<6)){//向右 
 86             if(check(now.w[i].x,now.w[i].y+now.w[i].len,now)){
 87                 now.w[i].y++;
 88                 if(prefa.w[i]!=now.w[i]){
 89                     dfs(deep+1,now,fa); 
 90                 }
 91                 now.w[i].y--;
 92             }
 93             
 94         }
 95         if(i!=1&&!u.ang&&(u.y>1)){//向左 
 96             if(check(now.w[i].x,now.w[i].y-1,now)){
 97                 now.w[i].y--;
 98                 if(prefa.w[i]!=now.w[i]){
 99                     dfs(deep+1,now,fa);
100                 }
101                 now.w[i].y++;
102             }
103             
104         }
105         if(u.ang&&(u.x+u.len-1<6)){//向下 
106             if(check(now.w[i].x+now.w[i].len,now.w[i].y,now)){
107                 now.w[i].x++;
108                 if(prefa.w[i]!=now.w[i]){
109                     dfs(deep+1,now,fa);
110                 }
111                 now.w[i].x--;
112             }
113             
114         }
115         if(u.ang&&(u.x>1)){//向上 
116             if(check(now.w[i].x-1,now.w[i].y,now)){
117                 now.w[i].x--;
118                 if(prefa.w[i]!=now.w[i]){
119                     dfs(deep+1,now,fa);
120                 }
121                 now.w[i].x++;
122             }
123             
124         }
125     }
126 }
127 
128 int main(){
129     freopen("Cola.txt","r",stdin);
130     int cnt=0;
131     for(int i=1;i<=6;i++)
132         for(int j=1;j<=6;j++){
133             scanf("%d",&a[i][j]);
134             n=max(a[i][j],n);
135         }
136     bool flag=0;
137     for(int i=1;i<6;i++){
138         if(a[3][i]==1&&a[3][i+1]==1)flag=1;
139     }
140     if(!flag){
141         puts("-1");
142         return 0;
143     }
144     for(int i=1;i<=n;i++){
145         flag=0;
146         for(int j=1;j<=6;j++){
147             for(int k=1;k<=6;k++){
148                 if(a[j][k]==i){
149                     if(k+1<=6&&a[j][k+1]==i&&(k+2>6||a[j][k+2]!=i)){//2格橫着 
150                         car[i]=make_node(j,k,2,0);
151                         flag=1;
152                         break;
153                     }
154                     if(k+2<=6&&a[j][k+1]==i&&a[j][k+2]==i){//3格橫着 
155                         car[i]=make_node(j,k,3,0);
156                         flag=1;
157                         break;
158                     }
159                     if(j+1<=6&&a[j+1][k]==i&&(j+2>6||a[j+2][k]!=i)){//2格豎着 
160                         car[i]=make_node(j,k,2,1);
161                         flag=1;
162                         break;
163                     }
164                     if(j+2<=6&&a[j+1][k]==i&&a[j+2][k]==i){//3格豎着 
165                         car[i]=make_node(j,k,3,1);
166                         flag=1;
167                         break;
168                     }
169                 }
170             }
171             if(flag)break;
172         }
173     }
174     for(int i=2;i<=n;i++){
175         if(!car[i].ang&&car[i].x==car[1].x&&car[i].y>=car[1].y){
176             puts("-1");
177             return 0;
178         }
179     }
180     State now=make_sta(car);
181     dfs(1,now,now);
182     if(ans<=10)printf("%d\n",ans);
183     else puts("-1");
184     return 0;
185 }

 

D.Tapioka


題意:給出三個字符串,刪除其中的“bubble” 和 “tapioka” ,再按照原來的順序輸出,刪沒了就輸出"nothing"
解:小水題

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 char s[5][40];
 6 bool flag[5];
 7 int main(){
 8     int cnt=3;
 9     for(int i=1;i<=3;i++)scanf("%s",s[i]);
10     for(int i=1;i<=3;i++){
11         if(!strcmp(s[i],"bubble")||!strcmp(s[i],"tapioka")){
12             flag[i]=1;
13             cnt--;
14         }
15     }
16     if(!cnt){puts("nothing");}
17     else{
18         for(int i=1;i<=3;i++){
19             if(!flag[i])printf("%s ",s[i]);
20         }
21     }
22     puts("");
23     return 0;
24 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章