【蓝桥杯】第七届国赛C语言B组 3.棋子换位

有n个棋子A,n个棋子B,在棋盘上排成一行。
它们中间隔着一个空位,用“.”表示,比如:

AAA.BBB

现在需要所有的A棋子和B棋子交换位置。
移动棋子的规则是:
1. A棋子只能往右边移动,B棋子只能往左边移动。
2. 每个棋子可以移动到相邻的空位。
3. 每个棋子可以跳过相异的一个棋子落入空位(A跳过B或者B跳过A)。

AAA.BBB 可以走法:
移动A ==> AA.ABBB
移动B ==> AAAB.BB

跳走的例子:
AA.ABBB ==> AABA.BB

以下的程序完成了AB换位的功能,请仔细阅读分析源码,填写划线部分缺失的内容。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 void move(char* data, int from, int to)
 5 {
 6     data[to] = data[from];
 7     data[from] = '.';
 8 }
 9 
10 int valid(char* data, int k)
11 {
12     if(k<0 || k>=strlen(data)) return 0;
13     return 1;
14 }
15     
16 void f(char* data)
17 {
18     int i;
19     int tag;
20     int dd = 0; // 移动方向
21     
22     while(1){
23         tag = 0;
24         for(i=0; i<strlen(data); i++){
25             if(data[i]=='.') continue;
26             if(data[i]=='A') dd = 1;
27             if(data[i]=='B') dd = -1;
28             
29             if(valid(data, i+dd) && valid(data,i+dd+dd) 
30             && data[i+dd]!=data[i] && data[i+dd+dd]=='.'){ 
31             //如果能跳... 
32                 move(data, i, i+dd+dd);
33                 printf("%s\n", data);
34                 tag = 1;
35                 break;
36             }
37         }
38         
39         if(tag) continue;
40         
41         for(i=0; i<strlen(data); i++){
42             if(data[i]=='.') continue;
43             if(data[i]=='A') dd = 1;
44             if(data[i]=='B') dd = -1;            
45                  
46             if(valid(data, i+dd) && data[i+dd]=='.'){ 
47             // 如果能移动...
48                 if( ______________________ ) continue;  //填空位置 
49                 move(data, i, i+dd);
50                 printf("%s\n", data);
51                 tag = 1;
52                 break;
53             }
54         }
55         
56         if(tag==0) break;                    
57     }
58 }
59     
60 int main()
61 {
62     char data[] = "AAA.BBB";    
63     f(data);
64     return 0;
65 }

不太会 只能猜一下

首先把要补全的代码注释掉  看看是什么效果

应该是在这个地方出错的

所以我们应该避免出现这种情况

模仿上边的判断条件

if(valid(data, i+dd) && valid(data,i+dd+dd) 
            && data[i+dd]!=data[i] && data[i+dd+dd]=='.')

我们加上

valid(data,i+dd+dd)

根据猜测再加上

data[i+dd+dd] == data[i-dd] && valid(data,i-dd)

试一哈

真的是不会 只能瞎猜 万一对了呢?

猜你喜欢

转载自www.cnblogs.com/duny31030/p/9071626.html
今日推荐