#6905. 棋子换位

棋子换位

这是一道代码填空题,只提交填在虚线部分的内容,且不要有空格

题目描述

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

AAA.BBB

现在需要所有的 A 棋子和 B 棋子交换位置。 移动棋子的规则是:

A 棋子只能往右边移动,B 棋子只能往左边移动。
每个棋子可以移动到相邻的空位。
每个棋子可以跳过相异的一个棋子落入空位(A 跳过 B 或者 B 跳过 A )。

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

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

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

源代码


#include <stdio.h>
#include <string.h>

void move(char* data, int from, int to)
{
    data[to] = data[from];
    data[from] = '.';
}

int valid(char* data, int k)
{
    if(k<0 || k>=strlen(data)) return 0;
    return 1;
}
    
void f(char* data)
{
    int i;
    int tag;
    int dd = 0; // 移动方向
    
    while(1){
        tag = 0;
        for(i=0; i<strlen(data); i++){
            if(data[i]=='.') continue;
            if(data[i]=='A') dd = 1;
            if(data[i]=='B') dd = -1;
            
            if(valid(data, i+dd) && valid(data,i+dd+dd) 
            && data[i+dd]!=data[i] && data[i+dd+dd]=='.'){ 
            //如果能跳... 
                move(data, i, i+dd+dd);
                printf("%s\n", data);
                tag = 1;
                break;
            }
        }
        
        if(tag) continue;
        
        for(i=0; i<strlen(data); i++){
            if(data[i]=='.') continue;
            if(data[i]=='A') dd = 1;
            if(data[i]=='B') dd = -1;            
                 
            if(valid(data, i+dd) && data[i+dd]=='.'){ 
            // 如果能移动...
                if( _______________ ) continue; 
                move(data, i, i+dd);
                printf("%s\n", data);
                tag = 1;
                break;
            }
        }
        
        if(tag==0) break;                    
    }
}
    
int main()
{
    char data[] = "AAAA.BBBB";    
    f(data);
    return 0;
}

```java
import java.util.*;
public class Main
{
    static void move(char[] data, int from, int to)
    {
        data[to] = data[from];
        data[from] = '.';
    }
    
    static boolean valid(char[] data, int k)
    {
        if(k<0 || k>=data.length) return false;
        return true;
    }
    
    static void f(char[] data)
    {
        while(true){
            boolean tag = false;
            for(int i=0; i<data.length; i++){
                int dd = 0; // 移动方向
                if(data[i]=='.') continue;
                if(data[i]=='A') dd = 1;
                if(data[i]=='B') dd = -1;
                
                if(valid(data, i+dd) && valid(data,i+dd+dd) 
                && data[i+dd]!=data[i] && data[i+dd+dd]=='.'){ 
                // 如果能跳...
                    move(data, i, i+dd+dd);
                    System.out.println(new String(data));
                    tag = true;
                    break;
                }
            }
            
            if(tag) continue;
            
            for(int i=0; i<data.length; i++){
                int dd = 0; // `移动方向
                if(data[i]=='.') continue;
                if(data[i]=='A') dd = 1;
                if(data[i]=='B') dd = -1;            
                     
                if(valid(data, i+dd) && data[i+dd]=='.'){ 
                // 如果能移动...
                    if( _______________) continue; 
                    move(data, i, i+dd);
                    System.out.println(new String(data));
                    tag = true;
                    break;
                }
            }
            
            if(tag==false) break;                    
        }
    }
    
    public static void main(String[] args)
    {
        char[] data = "AAAA.BBBB".toCharArray();    
        f(data);
    }
}

提交答案

{{ input(1) }}