有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 ", 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 ", 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)
试一哈
真的是不会 只能瞎猜 万一对了呢?