机器人塔--dfs+枚举
1.仔细考虑,你会发现如果固定了最后一层,那么上面就一目了然了,那么我们就dfs全排列枚举
2.再一看n+m<231,那么最多21的全排列,不多
3.排列后就要从下而上check,用异或来实现,A表false,B表true
4.a,b根据推出来的减,<0return false,直到顶层i==1结束i=0
P8644 [蓝桥杯 2016 国 B] 机器人塔 - 洛谷
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<int,int> pii;
bool aa[300];
int n,m,x;
ll an;
bool check(bool aa[],int a,int b)
{int i=x;bool bb[250];///一定要重新建一个数组 for(int i=1;i<=x;i++) bb[i]=aa[i]; while(i)///从上到下 {for(int j=1;j<i;j++){bb[j]=bb[j]^bb[j+1];if(bb[j]) b--;if(!bb[j]) a--;if(a<0) return false;if(b<0) return false;}i--;}return true;}
void dfs(int i,int a,int b)///全排列
{if(a<0||b<0) return;if(i==x+1){if(check(aa,a,b)){an++;}return;}aa[i]=true;dfs(i+1,a,b-1);aa[i]=false;dfs(i+1,a-1,b);}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=sqrt(2*(n+m));;i--){if(i*(i+1)==2*(n+m)){x=i;break;}}dfs(1,n,m);cout<<an;return 0;}