zoukankan      html  css  js  c++  java
  • 【蓝桥杯】第七届国赛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
    ", 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)

    试一哈

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

    文章搬运自我的个人博客http://duny31030.top 原博客为静态博客,因备份丢失无法继续更新,所以又搬运回博客园,可能部分文章阅读体验不好,可以到我的静态博客搜索相同标题查看
  • 相关阅读:
    易普优高级计划排程Light版助力中小企业实现精益化计划
    06易普优APS行业方案:包装印刷行业高级计划排程
    APS高级计划排程系统应该支持的企业应用场景
    易普优APS应用案例:线束行业生产计划排产
    某PCBA企业应用易普优APS实现高级计划排程案例
    APS高级计划排程系统应该支持的企业应用场景
    oracle 字符串分割
    速度极快的导出excel
    dev winform导出功能
    sql with as union all
  • 原文地址:https://www.cnblogs.com/duny31030/p/9071626.html
Copyright © 2011-2022 走看看