ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

衔尾蛇

2021-01-01 12:57:24  阅读:482  来源: 互联网

标签:衔尾 方案 红蛇 尾巴 dfs str include


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有