其他分享
首页 > 其他分享> > 衔尾蛇

衔尾蛇

作者:互联网

链接: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