OpenJudge 2.5-2990 符号三角形
Description
-
符号三角形的第1行有n个由“+”和”“-组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同。
n=7时的1个符号三角形如下:
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+ -
Input
-
每行1个正整数n<=24,n=0退出.
Output
-
n和符号三角形的个数.
Sample Input
15 16 19 20 0
15 1896 16 5160 19 32757 20 59984
思路简析:
这道题我用了两个函数,一个用来深搜(其实也就离一般的递归不远了),推出首层所有可能的情况,到达边界(推完之后)就调用另一个函数推整个三角形(类似构图的思想,但不用构图,计算正号或负号的个数,再判断是否是整个三角形的一半就可以了)。至于具体制图过程,在代码中有详细注释(详细看代码)。另外注意一点,输入n的时候就可以判断整个三角形的符号个数是否能被2整除,如果不能,则不能达到分成正号等于负号的情况,就直接按格式输出0。还有一点,此题容易超时,能省则省。
代码实现:
#include<cstdio>
#include<cstring>
int a[25][25],n,sum;
void f()
{
int i,j,s=0;
for(i=0;i<n;i++)//第一层的负号数量
s+=a[0][i];
for(i=1;i<n;i++)//2...n层
for(j=0;j<n-i;j++)//n行就有n-i+1个符号
{
a[i][j]=(a[i-1][j]+a[i-1][j+1])%2;//上方两个异号
/*
① 1 1 同负 结果:1
② 0 0 同正 结果:0
③ 1 0 一正一负 结果:0
综上所述,只有同负才为1,才会标记a[i][j]为负
*/
s+=a[i][j];//负号个数+1
}
if(s==n*(n+1)/2/2)//如果负号个数是符号个数的一半
sum++;
}
void dfs(int c)
{
if(c==n)
{
f();
return ;
}
else
{
for(int i=0;i<2;i++)//0表示加号,1表示负号
{
a[0][c]=i;
dfs(c+1);
}
}
}
int main()
{
while(scanf("%d",&n)&&n!=0)
{
sum=0;
if(n*(n+1)/2%2!=0)
printf("%d 0\n",n);
else
{
dfs(0);
printf("%d %d\n",n,sum);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现