蓝桥杯 机器人塔 【bfs】

机器人塔

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

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

例如 用户输入:
1 2
程序应该输出:
3
用户输入:
3 3
程序应该输出:
4

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

解题思路

水题,很直接的想法,从最底层向上一个一个搜就行了,500*500*2不会t也不会爆栈。

Code

#include 
using namespace std;
char tw[501][501];
int a,b,tot,last;
void dfs(int r,int j)
{
	if(r == 0) {
		tot++;
		return ;
	}

	if(a > 0) {
		if(r==last || (tw[r+1][j] == 'A' && tw[r+1][j+1] == 'A') || (tw[r+1][j] == 'B' && tw[r+1][j+1] == 'B')) {
			tw[r][j] = 'A';
			a--;
			if(j == r)
				dfs(r-1,1);
			else
				dfs(r,j+1);
			a++;
		}
	}
	if(b > 0) {
		if(r==last || (tw[r+1][j] == 'A' && tw[r+1][j+1] == 'B') || (tw[r+1][j] == 'B' && tw[r+1][j+1] == 'A')) {
			tw[r][j] = 'B';
			b--;
			if(j == r)
				dfs(r-1,1);
			else
				dfs(r,j+1);
			b++;
		}
	}
}
int main()
{
	cin >> a >> b;
	tot = 0;
	int num=0;
	for(last=1;true;last++) {
		num += last;
		if(num == a+b)
			break;
	}
	dfs(last,1);
	cout << tot << endl;
} 

 

你可能感兴趣的:(Accept)