《啊哈!算法》-第 3 章:枚举,很暴力!

炸弹人

一个炸弹人游戏,玩家可以在空地安防炸弹,炸弹威力巨大,可以一直炸到边缘去。.表示空地,#表示墙,G表示怪物,求出哪一个空地能炸到的怪物最多。且那个一个空地是有路可以到达的。

输入:

char a[NUM][NUM] = {
  {'#','#','#','#','#','#','#','#','#','#','#','#','#'},
  {'#','G','G','.','G','G','G','#','G','G','G','.','#'},
  {'#','#','#','.','#','G','#','G','#','G','#','G','#'},
  {'#','.','.','.','.','.','.','.','#','.','.','G','#'},
  {'#','G','#','.','#','#','#','.','#','G','#','G','#'},
  {'#','G','G','.','G','G','G','.','#','.','G','G','#'},
  {'#','G','#','.','#','G','#','.','#','.','#','.','#'},
  {'#','#','G','.','.','.','G','.','.','.','.','.','#'},
  {'#','G','#','.','#','G','#','#','#','.','#','G','#'},
  {'#','.','.','.','G','#','G','G','G','.','G','G','#'},
  {'#','G','#','.','#','G','#','G','#','.','#','G','#'},
  {'#','G','G','.','G','G','G','#','G','.','G','G','#'},
  {'#','#','#','#','#','#','#','#','#','#','#','#','#'}
};

源代码:

#include <stdio.h>
#define NUM 13

char a[NUM][NUM] = {...};

int main(void) {
  int i, j, x, y, q, p;
  int num = 0;
  int max = 0;

  for (i = 1; i < NUM - 1; i++) {
    for (j = 1; j < NUM - 1; j++) {
      num = 0;

      if (
        a[i][j] == '.' &&
        (a[i - 1][j] == '.' ||
        a[i][j + 1] == '.' ||
        a[i - 1][j] == '.' ||
        a[i][j - 1] == '.')
      ) {
        // 杀上边的怪
        x = i;
        y = j;

        while (a[x][y] != '#') {
          if (a[x][y] == 'G') {
            num += 1;
          }
          x -= 1;          
        }

        // 杀右边的怪
        x = i;
        y = j;

        while (a[x][y] != '#') {
          if (a[x][y] == 'G') {
            num += 1;
          }
          
          y += 1;
        }

        // 杀下边的怪
        x = i;
        y = j;

        while (a[x][y] != '#') {
          if (a[x][y] == 'G') {
            num += 1;
          }
          
          x += 1;
        }

        // 杀左边的怪
        x = i;
        y = j;

        while (a[x][y] != '#') {
          if (a[x][y] == 'G') {
            num += 1;
          }
          
          y -= 1;
        }

        if (num >= max) {
          max = num;
          q = i;
          p = j;

          printf("%d, (%d, %d)\n", num, q, p);          
        }
      }
    }
  }

  printf("(%d, %d)\n", q, p);
  
  return 0;
}

全排列

全排列是一种特殊的排列,比如 123 的全排列就是:123、132、213、231、312、321。

下面的实现方法采用的是穷举法,在算 123456789 的全排列效率很低。

#include <stdio.h>

void fn(len) {
  int a[10], i, j, k, l;
  int start = 1;
  int end = len + 1;
  int flag = 1;

  for (i = 1; i <= 10; i++) {
    a[i] = 0;
  }

  for (i = 1; i < len; i++) {
    start *= 10;
    end *= 10;
  }

  for (i = start; i < end; i++) {
    j = i;
    flag = 1;

    for (k = 1; k <= 10; k++) {
      a[k] = 0;
    }

    while (j != 0) {
      l = j % 10;

      if (a[l] == 0 && l <= len) {
        a[l] = 1;
        j /= 10;
      } else {
        flag = 0;
        break;
      }
    }

    if (flag == 1) {
      printf("%d\n", i);
    }
  }
}

int main(void) {
  int n;

  scanf("%d", &n);

  fn(n);

  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值