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
2 #include
3 #include
4 #include
D.Tapioka
题意:给出三个字符串,删除其中的“bubble” 和 “tapioka” ,再按照原来的顺序输出,删没了就输出"nothing"
解:小水题
1 #include
2 #include
3 #include
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 }