总是有一个程序的bug没找到

 算法训练 Lift and Throw  
时间限制:3.0s   内存限制:256.0MB
    
问题描述
  给定一条标有整点(1, 2, 3, ...)的射线. 定义两个点之间的距离为其下标之差的绝对值.
  Laharl, Etna, Flonne一开始在这条射线上不同的三个点, 他们希望其中某个人能够到达下标最大的点.
  每个角色只能进行下面的3种操作, 且每种操作不能每人不能进行超过一次.
  1.移动一定的距离
  2.把另一个角色高举过头
  3.将举在头上的角色扔出一段距离
  每个角色有一个movement range参数, 他们只能移动到没有人的位置, 并且起点和终点的距离不超过movement range.
  如果角色A和另一个角色B距离为1, 并且角色B没有被别的角色举起, 那么A就能举起B. 同时, B会移动到A的位置,B原来所占的位置变为没有人的位置. 被举起的角色不能进行任何操作, 举起别人的角色不能移动.同时, 每个角色还有一个throwing range参数, 即他能把举起的角色扔出的最远的距离. 注意, 一个角色只能被扔到没有别的角色占据的位置. 我们认为一个角色举起另一个同样举起一个角色的角色是允许的. 这种情况下会出现3个人在同一个位置的情况. 根据前面的描述, 这种情况下上面的两个角色不能进行任何操作, 而最下面的角色可以同时扔出上面的两个角色. 你的任务是计算这些角色能够到达的位置的最大下标, 即最大的数字x, 使得存在一个角色能够到达x.
输入格式
  输入共三行, 分别为Laharl, Etna, Floone的信息.
  每一行有且仅有3个整数, 描述对应角色的初始位置, movement range, throwing range.
  数据保证3个角色的初始位置两两不相同且所有的数字都在1到10之间.</div>
输出格式
  仅有1个整数, 即Laharl, Etna, Flonne之一能到达的最大距离.
样例输入
9 3 3
4 3 1
2 3 3
样例输出
15
样例说明
  一开始Laharl在位置9, Etna在位置4, Flonne在位置2.
  首先, Laharl移动到6.
  然后Flonne移动到位置5并且举起Etna.
  Laharl举起Flonne将其扔到位置9.
  Flonne把Etna扔到位置12.
  Etna移动到位置15.
 
我想的思路是一人有三种操作,分别是移动,举起旁边的,扔自己上面的。三个人就是九种。
然后九种操作进行深度搜索。
样例给过了,但提交只有两组数据对了。
做了两晚上都没调好,我感觉我的思路应该没有错误。
 如果你有思路,希望告知我。
递归的程序虽然比较好想,但是稍微一复杂根本就没法调bug啊,很容易迷失在不知第几层。。。
  1 #include <iostream>
  2 #include <cstdio>
  3 
  4 using namespace std;
  5 
  6 typedef struct node{
  7     int loca;
  8     int moverange;
  9     int throwrange;
 10 };
 11 struct node a[4];
 12 int w[100]={0};
 13 int is_move[4]={0};
 14 int is_lift[4]={0};
 15 int is_throw[4]={0};
 16 int is_belifted[4]={0};
 17 int ans=0;
 18 int step[10]={0};
 19 
 20 int dfs();
 21 //第一个人的第一种操作,移动
 22 void fun11(){
 23     if(!is_move[1]){
 24         int t=a[1].loca+a[1].moverange;
 25         for(int i=a[1].loca-a[1].moverange; i<=t; i++){
 26             if(!w[i] && i>=0){
 27                 int t1=w[a[1].loca];
 28                 int t2=a[1].loca;
 29                 int t3=is_move[1];
 30                 w[a[1].loca]=0;
 31                 w[i]=1;
 32                 a[1].loca=i;
 33                 is_move[1]=1;
 34                 dfs();
 35                 w[a[1].loca]=t1;
 36                 w[i]=0;
 37                 a[1].loca=t2;
 38                 is_move[1]=t3;
 39             }
 40 
 41         }
 42     }
 43 }
 44 //第一个人的第二种操作,举起两边的
 45 void fun12(){
 46     for(int i=1;i<=3;i++){
 47         if(w[a[1].loca-1]==i){
 48             int t1=w[a[1].loca-1];
 49             int t2=is_belifted[i];
 50             int t3=is_lift[1];
 51 
 52             w[a[1].loca-1]=0;
 53             is_belifted[i]=1;
 54             is_lift[1]=i;
 55             dfs();
 56 
 57             w[a[1].loca-1]=t1;
 58             is_belifted[i]=t2;
 59             is_lift[1]=t3;
 60         }
 61         if(w[a[1].loca+1]==i){
 62             int t1=w[a[1].loca+1];
 63             int t2=is_belifted[i];
 64             int t3=is_lift[1];
 65             w[a[1].loca+1]=0;
 66             is_belifted[i]=1;
 67             is_lift[1]=i;
 68             dfs();
 69             w[a[1].loca+1]=t1;
 70             is_belifted[i]=t2;
 71             is_lift[1]=t3;
 72         }
 73     }
 74 }
 75 //第一个人的第三种操作,扔自己上面的
 76 void fun13(){
 77     if(!is_throw[1] && is_lift[1]!=0){
 78         for(int i=a[1].loca-a[1].throwrange; i<=a[1].loca+a[1].throwrange; i++){
 79             if(!w[i] && i>=0){
 80                 int t1=w[a[1].loca];
 81                 int t2=w[i];
 82                 int t3=a[1].loca;
 83                 int t4=is_throw[1];
 84                 w[a[1].loca]=0;
 85                 w[i]=is_lift[1];
 86                 a[1].loca=i;
 87                 is_throw[1]=1;
 88                 dfs();
 89                 w[a[1].loca]=t1;
 90                 w[i]=t2;
 91                 a[1].loca=t3;
 92                 is_throw[1]=t4;
 93             }
 94 
 95         }
 96     }
 97 }
 98 
 99 //第二个人的第一种操作,移动
100 void fun21(){
101     if(!is_move[2]){
102         int t=a[2].loca+a[2].moverange;
103         for(int i=a[2].loca-a[2].moverange; i<=t; i++){
104             if(!w[i] && i>=0){
105                 int t1=w[a[2].loca];
106                 int t2=a[2].loca;
107                 int t3=is_move[2];
108                 w[a[2].loca]=0;
109                 w[i]=2;
110                 a[2].loca=i;
111                 is_move[2]=1;
112                 dfs();
113                 w[a[2].loca]=t1;
114                 w[i]=0;
115                 a[2].loca=t2;
116                 is_move[2]=t3;
117             }
118 
119         }
120     }
121 }
122 //第二个人的第二种操作,举起两边的
123 void fun22(){
124     for(int i=1;i<=3;i++){
125         if(w[a[2].loca-1]==i){
126             int t1=w[a[2].loca-1];
127             int t2=is_belifted[i];
128             int t3=is_lift[2];
129             w[a[2].loca-1]=0;
130             is_belifted[i]=2;
131             is_lift[2]=i;
132             dfs();
133             w[a[2].loca-1]=t1;
134             is_belifted[i]=t2;
135             is_lift[2]=t3;
136         }
137         if(w[a[2].loca+1]==i){
138             int t1=w[a[2].loca+1];
139             int t2=is_belifted[i];
140             int t3=is_lift[2];
141             w[a[2].loca+1]=0;
142             is_belifted[i]=2;
143             is_lift[2]=i;
144             dfs();
145             w[a[2].loca+1]=t1;
146             is_belifted[i]=t2;
147             is_lift[2]=t3;
148         }
149     }
150 }
151 //第二个人的第三种操作,扔自己上面的
152 void fun23(){
153     if(!is_throw[2] && is_lift[2]!=0){
154         for(int i=a[2].loca-a[2].throwrange; i<=a[2].loca+a[2].throwrange; i++){
155             if(!w[i] && i>=0){
156                 int t1=w[a[2].loca];
157                 int t2=w[i];
158                 int t3=a[2].loca;
159                 int t4=is_throw[2];
160                 w[a[2].loca]=0;
161                 w[i]=is_lift[2];
162                 a[2].loca=i;
163                 is_throw[2]=1;
164                 dfs();
165                 w[a[2].loca]=t1;
166                 w[i]=t2;
167                 a[2].loca=t3;
168                 is_throw[2]=t4;
169             }
170 
171         }
172     }
173 }
174 //第三个人的第一种操作,移动
175 void fun31(){
176     if(!is_move[3]){
177         int t=a[3].loca+a[3].moverange;
178         for(int i=a[3].loca-a[3].moverange; i<=t; i++){
179             if(!w[i] && i>=0){
180                 int t1=w[a[3].loca];
181                 int t2=a[3].loca;
182                 int t3=is_move[3];
183                 w[a[3].loca]=0;
184                 w[i]=3;
185                 a[3].loca=i;
186                 is_move[3]=1;
187                 dfs();
188                 w[a[3].loca]=t1;
189                 w[i]=0;
190                 a[3].loca=t2;
191                 is_move[3]=t3;
192             }
193 
194         }
195     }
196 }
197 //第三个人的第二种操作,举起两边的
198 void fun32(){
199     for(int i=1;i<=3;i++){
200         if(w[a[3].loca-1]==i){
201             int t1=w[a[3].loca-1];
202             int t2=is_belifted[i];
203             int t3=is_lift[3];
204             w[a[3].loca-1]=0;
205             is_belifted[i]=3;
206             is_lift[3]=i;
207             dfs();
208             w[a[3].loca-1]=t1;
209             is_belifted[i]=t2;
210             is_lift[3]=t3;
211         }
212         if(w[a[3].loca+1]==i){
213             int t1=w[a[3].loca-1];
214             int t2=is_belifted[i];
215             int t3=is_lift[3];
216             w[a[3].loca+1]=0;
217             is_belifted[i]=3;
218             is_lift[3]=i;
219             dfs();
220             w[a[3].loca+1]=t1;
221             is_belifted[i]=t2;
222             is_lift[3]=t3;
223         }
224     }
225 }
226 //第三个人的第三种操作,扔自己上面的
227 void fun33(){
228     if(!is_throw[3] && is_lift[3]!=0){
229         for(int i=a[3].loca-a[3].throwrange; i<=a[3].loca+a[3].throwrange; i++){
230             if(!w[i] && i>=0){
231                 int t1=w[a[3].loca];
232                 int t2=w[i];
233                 int t3=a[3].loca;
234                 int t4=is_throw[3];
235                 w[a[3].loca]=0;
236                 w[i]=is_lift[3];
237                 a[3].loca=i;
238                 is_throw[3]=1;
239                 dfs();
240                 w[a[3].loca]=t1;
241                 w[i]=t2;
242                 a[3].loca=t3;
243                 is_throw[3]=t4;
244             }
245 
246         }
247     }
248 }
249 
250 int dfs(){
251     ans=max(ans,a[1].loca);
252     ans=max(ans,a[2].loca);
253     ans=max(ans,a[3].loca);
254     //if(is_move[1]==1&&is_move[2]==1&&is_move[3]==1&&is_throw[1]==1&&is_throw[2]==1&&is_throw[3]==0||is_throw[1]==1&&is_throw[2]==0&&is_throw[3]==1||is_throw[1]==0&&is_throw[2]==1&&is_throw[3]==1){
255     //    return 0;
256     //}else{
257         for(int i=1;i<=9;i++){
258             if(!step[i]){
259                 switch(i){
260                 case 1:step[1]=1;fun11();step[1]=0;break;
261                 case 2:step[2]=1;fun12();step[2]=0;break;
262                 case 3:step[3]=1;fun13();step[3]=0;break;
263                 case 4:step[4]=1;fun21();step[4]=0;break;
264                 case 5:step[5]=1;fun22();step[5]=0;break;
265                 case 6:step[6]=1;fun23();step[6]=0;break;
266                 case 7:step[7]=1;fun31();step[7]=0;break;
267                 case 8:step[8]=1;fun32();step[8]=0;break;
268                 case 9:step[9]=1;fun33();step[9]=0;break;
269                 }
270             }
271 
272         }
273         return 0;
274     //}
275 
276 }
277 
278 int main()
279 {
280     for(int i=1;i<=3;i++){
281         scanf("%d %d %d",&a[i].loca,&a[i].moverange,&a[i].throwrange);
282     }
283     dfs();
284     printf("%d\n",ans);
285     return 0;
286 }

 

posted @ 2016-11-18 23:15  多一份不为什么的坚持  阅读(211)  评论(0编辑  收藏  举报