• 等式转换(熟悉一下链表,指针引用)


      1 /***************************************************************************** 
      2  *输入一个正整数X,在下面的等式左边的数字之间添加 + 号或者 - 号,使得等式成立。 
      3  *1 2 3 4 5 6 7 8 9 = X 
      4  *比如: 
      5  *12 - 34 + 5 - 67 + 89 = 5 
      6  *1 + 23 + 4 - 5 + 6 - 7 - 8 - 9 = 5 
      7  *请编写程序,统计满足输入整数的所有整数个数。 
      8  *输入: 正整数,等式右边的数字 
      9  *输出: 使该等式成立的个数 
     10  *样例输入:5 
     11  *样例输出:21 
     12  *************************************************************************/
     13 
     14 //使用链表是因为计算等式的值的时候,容易将10*的好处理,把节点直接删掉,但是要管理内存,
     15 //复制链表的时候也不像数组那样方便,总之是很麻烦,权单熟悉一下链表的插入删除操作吧~~
     16 //用数组模拟链表要方便多了,1 2 3 + 4 5,把数据从数组里读出来,另外设个a[9]-{0},用来存储
     17 //得到的值,简单多了。
     18 #include <iostream>
     19 #include<ctime>
     20 #include<string>
     21 using namespace std;
     22 const int target=5;//等式右边的值
     23 const n=9;//等式左边有几个不同的数?比如1~4是5个,1~9是9个
     24 struct node{
     25     int data;
     26     char operate;
     27     node *next;
     28 };
     29 void copyChain(node *&header,node *&opp)//拷贝链表,这个好麻烦,用数组模拟链表简单一些
     30 {
     31     opp=NULL;
     32     node *q=header;
     33     node *t=opp;
     34     while(q)
     35     {
     36         node *p=new node;
     37         p->data=q->data;
     38         p->operate=q->operate;
     39         p->next=NULL;
     40         if(opp==NULL)
     41             opp=p;
     42         else
     43             t->next=p;
     44         t=p;
     45         q=q->next;
     46     }
     47 }
     48 
     49 int answer(node *&t)//计算等式左边的值
     50 {
     51     int k1=0,k2=0;
     52     node *q=t;//操作链表的时候,先拷贝个头指针,用于指向操作的位置
     53     while(q!=NULL && q->next!=NULL)//这里要弄明白
     54     {
     55         if(q->operate==' ')//先把乘10的部分计算出来,合并,删除节点
     56         {
     57             node *p=q->next;
     58             q->data=10*q->data+p->data;
     59             q->operate=p->operate;
     60             q->next=p->next;
     61             delete p;
     62         }
     63         else q=q->next;//这个不能丢,死循环了
     64     }
     65     if(t->next==NULL)//若删除的就剩一个节点了,接着返回
     66         return t->data;
     67     q=t;
     68     k2=q->data;
     69     while(q->next!=NULL)//计算加减法
     70     {
     71         if(q->operate=='+')
     72             k1=q->next->data;
     73         else if(q->operate=='-')
     74             k1=-q->next->data;
     75         q=q->next;
     76         k2+=k1;
     77     }
     78     return k2;
     79 }
     80     
     81 char transfer(const int i)//对应符号转换
     82 {
     83     if(i==0)
     84         return ' ';
     85     if(i==1)
     86         return '+';
     87     if(i==2)
     88         return '-';
     89     return ' ';
     90 }
     91 
     92 void dfs(node *&opp,node *&temp,int &count)//指针引用,其实是想拷贝一个链表传递过来,不知道怎么实现
     93                                            //temp是递归的时候用于记录操作的位置,opp是目前整个链表的情况
     94 {
     95     if(temp->next==NULL)
     96     {
     97         node *t=opp;
     98         copyChain(opp,t);//复制链表,这个必须复制
     99         int mm=answer(t);//计算值
    100         node *p=t;
    101         while(t)//把复制的链表内存释放了
    102         {
    103             p=t->next;
    104             delete t;
    105             t=p;
    106         }
    107 
    108         if(mm==target)//比较
    109         {
    110             count++;
    111             p=opp;//操作链表前复制头结点
    112             while(p)
    113             {
    114                 cout<<p->data<<p->operate;
    115                 p=p->next;
    116             }
    117             cout<<"="<<target<<endl;
    118         }
    119         return;
    120     }
    121     int i;
    122     for(i=0;i<3;i++)
    123     {
    124         temp->operate=transfer(i);//可以简化程序 char ch={' ','+','-'};...=ch[i];
    125         dfs(opp,temp->next,count);//深度优先搜索
    126     }
    127 }
    128 
    129 int main()
    130 {   
    131     int i,count=0;
    132     node *header,*opp;
    133     header=NULL;
    134     opp=header;
    135     for(i=1;i<=n;i++)
    136     {
    137         node *q=new node;
    138         q->data=i;
    139         q->operate=' ';
    140         q->next=NULL;
    141         if(header==NULL)
    142             header=q;
    143         else 
    144             opp->next=q;
    145         opp=q;
    146     }
    147     dfs(header,header,count);//传递指针的引用
    148     cout<<count<<endl;
    149     node *p;
    150     while(header)
    151     {
    152         p=header->next;
    153         delete header;
    154         header=p;
    155     }
    156     return 0;
    157 
    158 }

    结果:

    深度优先遍历,9个数有8个符号,在这8个符号位上各有3种可能,遍历检查

    感觉整的有点复杂了,拿数组代替链表,程序会简单很多,不知道有没有别的巧妙的思路来解决这个问题~

  • 相关阅读:
    李开复给学习计算机的学生的7点建议(转)
    linux 命令
    易中天的十句话
    11个笑话让你领悟人生
    心情不好的时候看看
    高校青年老师挣扎在辞职边缘 微薄工资继续啃老
    【33.00%】【vijos P1002】过河
    【33.33%】【codeforces 681D】Gifts by the List
    【19.05%】【codeforces 680D】Bear and Tower of Cubes
    【12.78%】【codeforces 677D】Vanya and Treasure
  • 原文地址:https://www.cnblogs.com/fkissx/p/4472640.html
Copyright © 2020-2023  润新知