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 }