zoukankan      html  css  js  c++  java
  • 回溯——oj1175 求0游戏

      遍历上花费了好长时间....

      题面:

      

      仍然是dfs+回溯。需要注意的是ascii码表上的顺序:‘ ’‘+’‘-’,可以建立两个char数组,一个存储0-9所有数字,另一个存储所用到的符号。当所用的符号个数为n-1时进行检查。我在遍历上出了点问题,样例一直没有过。主要是空格如何进行读取。思考了很久想到了倒序遍历,因为加减号并不影响运算的顺序,所以可以进行倒序遍历,当出现空格时处理带有空格的全部数字,然后再进行加减即可。代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int n,sum=0;
     5 char num[10]={'0','1','2','3','4','5','6','7','8','9'},ans[11];
     6 void dfs()
     7 {
     8     if (sum==n)
     9     {
    10         int fsum=0;
    11         for (int i=n;i>=0;i--)//倒序遍历
    12         {
    13             if (ans[i]==' ')
    14             {
    15                 int q=10,nsum=num[i+1]-'0';
    16                 while (ans[i]==' '&&i>=1)//对空格处的数进行特殊处理
    17                 {
    18                     nsum+=(num[i]-'0')*q;
    19                     q*=10;
    20                     i--;
    21                 }
    22                 if (ans[i]=='+')
    23                     fsum+=nsum;
    24                 else
    25                     fsum-=nsum;
    26             }
    27             else if (ans[i]=='+')
    28                 fsum+=num[i+1]-'0';
    29             else
    30                 fsum-=num[i+1]-'0';
    31         }
    32         if (fsum==0)
    33         {
    34             for (int i=1;i<=n;i++)
    35                 printf("%c%c",num[i],ans[i]);
    36             printf("%c
    ",num[n+1]);
    37         }
    38     }
    39     else
    40         for (int i=1;i<=3;i++)
    41         {
    42             sum++;
    43             if (i==1)
    44                 ans[sum]=' ';
    45             else if (i==2)
    46                 ans[sum]='+';
    47             else
    48                 ans[sum]='-';
    49             dfs();
    50             sum--;
    51         }
    52 }
    53 int main()
    54 {
    55     //freopen("add.in","r",stdin);
    56     //freopen("add.out","w",stdout);
    57     ans[0]='+';//第一个数字的前方一定是正号
    58     scanf("%d",&n);
    59     n--;
    60     dfs();
    61     return 0;
    62 }
    View Code

  • 相关阅读:
    srvany.exe和instsrv.exe_2
    srvany.exe和instsrv.exe
    C# “国密加密算法”SM系列的C#实现方法
    DMZ讲解
    java 判断字符串是否为json格式
    MFC DrawText如何使多行文字居中显示 Demo
    C++ 实现一个日志类
    数据库两个神器【索引和锁】
    CentOS 7.*编译安装PHP8
    Centos添加永久环境变量
  • 原文地址:https://www.cnblogs.com/hinanawitenshi/p/6398502.html
Copyright © 2011-2022 走看看