【a502】符号三角形问题

Time Limit: 1 second
Memory Limit: 32 MB

【问题描述】

在一般情况下,符号三角形的第一行有n个符号。按照2个同号的下面是“+”号,2个异号的下面是“-”号的规则生成符号三角形。例如:

+ + - + - + +
 + - - - - +
  - + + + -
   - + + -
    - + -
     - -
      +
即是一个由14个“+”号和14个“-”号组成的符号三角形。要求对于给定的n,计算有多少个不同的符号三角形,使其所包含的“+”和“-”的个数相同。要求用回溯法求解此问题。
【输入格式】

仅有一行,包含一个整数N,表示第一行有N个字符。

【输出格式】

仅有一行,不同的符号三角形的个数;当个数为0时,输出“No solution”

【输入样例】

4

【输出样例】

6

【题目链接】:http://noi.qz5z.com/viewtask.asp?ID=a502

【题解】

先用一层dfs枚举第一层的样子;
O(2^n)
然后根据第一层处理出整张图的样子;(也用dfs)
然后用趋近于O(N^2)的时间复杂度
处理出整张图的样子的时候;
可以加一个判断
if (负号或正号个数>(1+n)*n/4) return;
这个剪枝挺强力的吧.
处理的时候可以把所有的符号都移到最左边;左对齐;
a[i][j]由a[i-1][j]和a[i-1][j+1]决定;
(为它们的异或值)
一开始可以加一个判断if (1+n)*n/2为奇数;
那么就不可能有解;
依我对这个平台的了解;
它肯定会出一个(1+n)*n/2为奇数,然后n特别大的数据点。
[斜眼笑]

【完整代码】

#include <cstdio>

int n,ans = 0,temp;
int a[100][100];

void dfs2(int x,int y,int z,int f)
{
    if (z>temp || f > temp)
        return;
    if (x>n)
    {
        ans++;
        return;
    }
    if (y>n-x+1)
    {
        dfs2(x+1,1,z,f);
        return;
    }
    a[x][y] = a[x-1][y] ^ a[x-1][y+1];
    if (a[x][y]==1)
        dfs2(x,y+1,z+1,f);
    else
        dfs2(x,y+1,z,f+1);
}

void dfs1(int x,int z,int f)
{
    if (x > n)
    {
        dfs2(2,1,z,f);
        return;
    }
    a[1][x] = 1;
    dfs1(x+1,z+1,f);
    a[1][x] = 0;
    dfs1(x+1,z,f+1);
}

int main()
{
    scanf("%d",&n);
    if (((1+n)*n/2)&1)
    {
        puts("No solution");
        return 0;
    }
    temp = (1+n)*n/4;
    dfs1(1,0,0);
    if (ans==0)
        puts("No solution");
    else
        printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值