2016年第七届蓝桥杯【C++决赛赛B组】【第四题:机器人塔】——暴力DFS

标题:机器人塔

X星球的机器人表演拉拉队有两种服装,A和B。
他们这次表演的是搭机器人塔。

类似:

     A
    B B
   A B A
  A A B B
 B B B A B
A B A B B A

队内的组塔规则是:  
  A 只能站在 AA 或 BB 的肩上。
  B 只能站在 AB 或 BA 的肩上。

你的任务是帮助拉拉队计算一下,在给定A与B的人数时,可以组成多少种花样的塔。

输入一行两个整数 M 和 N,空格分开(0<M,N<500),分别表示A、B的人数,保证人数合理性。

要求输出一个整数,表示可以产生的花样种数。

例如:
用户输入:
1 2

程序应该输出:
3


再例如:
用户输入:
3 3

程序应该输出:
4

资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

暴力DFS必定超时,但是可以水一点分。

这里要注意的是:由于上一层已经选定'A''B'的限制,只要每一层的第一个确定下来,这一层就是一定的。所以可以dfs暴搜每一层(每一层只搜开头那一个)。

#include<bits/stdc++.h>
using namespace std;
int row, m, n;
long long ans;
char s[100];
int judge(char *s) {//这里进行后续的判断 
  char str[100][100];//开一个二维字符数组存储整个塔 
  for(int i = 1; i <= row; i++)
    str[i][1] = s[i];//先把搜到的每一层的第一个赋给二维数组的第一个 
  for(int i = 1; i < row; i++) {
    for(int j = 1; j <= i; j++) {//有了当前层第一个以及下一层的第一个,就可以开始逐渐补全整个塔 
      if(str[i][j]=='A'&&str[i+1][j]=='A') str[i+1][j+1] = 'A';
      if(str[i][j]=='A'&&str[i+1][j]=='B') str[i+1][j+1] = 'B';
      if(str[i][j]=='B'&&str[i+1][j]=='A') str[i+1][j+1] = 'B';
      if(str[i][j]=='B'&&str[i+1][j]=='B') str[i+1][j+1] = 'A';
    }
  }
  int numa = 0, numb = 0;
  for(int i = 1; i <= row; i++) {
    for(int j = 1; j <= i; j++) {//计算当前塔有多少个'A'和'B',从而判断该情况是否可行 
      if(str[i][j] == 'A') numa++;
      if(str[i][j] == 'B') numb++;
      //cout << str[i][j] << " ";
    }
    //cout << endl;
  }
  if(numa == m && numb == n) return 1;
  else
    return 0;
}
void dfs(int h) {
  if(h > row) {
    if(judge(s)) ans++;
    return;
  }
  s[h] = 'A';
  dfs(h+1);
  s[h] = 'B';
  dfs(h+1);
}
int main() {
  int sum = 0;
  cin >> m >> n;
  for(int i = 1; i < 1000; i++) {//确定总共有多少层 
    sum += i;
    if(sum >= m+n) {
      row = i;
      break;
    }
  }
  ans = 0;
  dfs(1);//从第一层开始搜 
  cout << ans << endl;
  return 0;
} 
这题教会我的是,多耐心尝试暴力dfs,搜索完之后是可以由已搜到的补全未知的。

猜你喜欢

转载自blog.csdn.net/daixinliangwyx/article/details/79996055