标题:机器人塔
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>, 不能通过工程设置而省略常用头文件。
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,搜索完之后是可以由已搜到的补全未知的。