衔尾蛇
作者:互联网
链接:https://ac.nowcoder.com/acm/contest/9854/D
来源:牛客网
光、对立和小红三个人在玩捉蛇游戏。
已知蛇有三种:红蛇、蓝蛇和绿蛇。蛇可以咬住自己的尾巴,形成衔尾蛇。每条蛇可以咬住自己的尾巴,也可以咬住别的蛇的尾巴。
一共有条红蛇,条蓝蛇,条绿蛇。她们想知道一共可以形成多少种不同的衔尾蛇的环?
注:蛇可以不用全部用完。
输入描述:
一行三个非负整数:、和
输出描述:
一个整数,为方案的数量。
示例1
输入
复制
1 1 1
输出
复制
8
说明
一条红蛇咬自己,一种方案。
一条蓝蛇咬自己,一种方案。
一条绿蛇咬自己,一种方案。
一条红蛇和一条蓝蛇互相咬对方的尾巴,一种方案。
一条红蛇和一条绿蛇互相咬对方的尾巴,一种方案。
一条绿蛇和一条蓝蛇互相咬对方的尾巴,一种方案。
三条蛇互相咬,红咬绿,绿咬蓝,蓝咬红,一种方案。
三条蛇互相咬,红咬蓝,蓝咬绿,绿咬红,一种方案。
一共8种方案。
示例2
输入
复制
1 0 0
输出
复制
1
说明
一条红蛇咬自己,显然只有这一种方案。
示例3
输入
复制
3 0 0
输出
复制
3
说明
一条红蛇咬自己,一种方案。
两条红蛇互相咬对方的尾巴,为一种方案。
三条红色互相咬,也是一种方案(1咬2的尾巴,2咬3的尾巴,3咬1的尾巴)
备注:
数据范围:
1 \leq a+b+c \leq 121≤a+b+c≤12
递归的时候一定不要写+=
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
unordered_map<string, bool> und;
int a, b, c;
int ans;
void dfs(string str){
string s;
s += str;
s += str;
if (str != ""){
bool flag = false;
for (int i = 0; i < str.size(); i ++){
if (und[s.substr(i, str.size())])
flag = true;
}
if (!flag){
und[str] = true;
// cout << str << endl;
ans ++;
}
}
if (a > 0){
a --;
dfs(str + 'a');
a ++;
}
if (b > 0){
b --;
dfs(str + 'b');
b ++;
}
if (c > 0){
c --;
dfs(str + 'c');
c ++;
}
}
int main(){
scanf("%d%d%d", &a, &b, &c);
dfs("");
cout << ans << endl;
return 0;
}
标签:衔尾,方案,红蛇,尾巴,dfs,str,include 来源: https://blog.csdn.net/qq_45772483/article/details/112059674