多米诺骨牌均衡状态

问题描述

小S玩起了多米诺骨牌,他排列了一行骨牌,并可能将某些骨牌向左或向右推倒。随着骨牌连锁反应的进行,一些骨牌可能因为左右两侧受力平衡而保持竖立。现在小S想要知道在所有动作完成后,哪些骨牌保持竖立。

给定一个表示骨牌初始状态的字符串,其中:

“L” 表示该位置的骨牌将向左倒。
“R” 表示该位置的骨牌将向右倒。
“.” 表示该位置的骨牌初始时保持竖立。
模拟整个骨牌倒下的过程,求出最终仍然保持竖立的骨牌的数目和位置。

测试样例
样例1:

输入:num = 14,data = “.L.R…LR…L…”
输出:‘4:3,6,13,14’

样例2:

输入:num = 5,data = “R…”
输出:‘0’

样例3:

输入:num = 1,data = “.”
输出:‘1:1’

解答C

思路

  1. 从左往右遍历字符串,凡是遇到竖立的骨牌则记录
  2. 当遇到第一个向左倒且之前不存在向右倒的情况,则清空之前记录的竖立骨牌。因为此牌左边没有向右倒的,所以此牌左边所有的骨牌都会倒下
  3. 当遇上第一个向右倒的骨牌时,应该寻找下一个向左倒的骨牌。找到两个骨牌中间竖立的骨牌数量必须是奇数才能有中间一块骨牌竖立。因此取其中一个即可
  4. 当遇上第一个向右倒的骨牌,如果前面有竖立的骨牌应当全部记录
  5. 当遍历达到最后且上一个骨牌倒向状态是向左,那么剩下的所有骨牌都应当被记录

C代码

PS:代码挺暴力的,没想过更好的实现。请广大网友指正

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

typedef enum _status { none, left = 1, right = 2 } status;

char *solution(int num, char *data) {
  // Please write your code here
  int offset;
  int count;
  int i, j;
  status lastStatus = none;
  int *tmpResult = malloc(sizeof(int) * num);
  int *result = malloc(sizeof(int) * num);
  char *output = NULL;

  i = 0;
  j = 0;
  count = 0;
  offset = 0;
  while (offset < num) {
    if (data[offset] == '.') {
      tmpResult[i] = offset+1;
      i++;
    } else if (data[offset] == 'L') {
      if (lastStatus == none)
        i = 0;
      else if (lastStatus == right) {
        if (i % 2) {
          result[count] = tmpResult[i / 2];
          count++;
        }
        i = 0;
      }
      lastStatus = left;
    } else if (data[offset] == 'R') {
      j = 0;
      while (j < i) {
        result[count] = tmpResult[j];
        count++;
        j++;
      }
      i = 0;
      lastStatus = right;
    }
    offset++;
  }
  if (lastStatus == left || lastStatus == none) {
    j = 0;
    while (j < i) {
      result[count] = tmpResult[j];
      count++;
      j++;
    }
  }

  output = malloc(sizeof(char) * count);
  i = 0;
  sprintf(output, "%d:", count);
  while (i < count) {
    sprintf(output + strlen(output), "%d,", result[i]);
    i++;
  }

  output[strlen(output) - 1] = '\0';
  free(tmpResult);
  free(result);
  return output;
}

int main() {
  //  You can add more test cases here
  printf("%d\n", strcmp(solution(14, ".L.R...LR..L.."), "4:3,6,13,14") == 0);
  printf("%d\n", strcmp(solution(5, "R...."), "0") == 0);
  printf("%d\n", strcmp(solution(1, "."), "1:1") == 0);

  return 0;
}

输出结果:

cbk:~/workspace/pg/postgres$ gcc -g test.c -o test
cbk:~/workspace/pg/postgres$ ./test
1
1
1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值