• poj3295 Tautology


    哈哈,这个题目比较有意思。

    一开始丝毫没有头绪,后来我想用分治的想法行不行呢,切割,然后函数返回该段的结果和结束位置,还很惆怅怎么存储的问题,然后我去洗头寻思出去溜达溜达,突然想起来我可以用结构体返回啊,这样就很简洁了,哈哈,这样什么都有了思路也很清晰,函数代码还真的不长,哈哈。

    后来一个劲的RE,才发现有1个元素的情况,再交,这回是WA了!通过检查这是因为我讨论N的时候忘记了一种情况。。。

    不过这题写出来还是很有成就感的。

    ××××××××××××××××××××××××××××××××××××××××××××××××

    总体思路就是 分治 + 递归

    p,q,r,s,t的值需要在iff中通过遍历来初始化。然后调用haha()

    struct res haha( int begin )   // tmp[begin]  ------>  5种操作的一种

    函数的功能是返回一种操作的结果和该操作影响的位置。我在代码里面写的已经很明晰了。

    在求得该操作对象的值时候有两种情况,一种是该值是p,q,r,s,t中的一个,另一种是该值是5种操作得出的结果,这种情况就要递归调用haha。

    代码还是比较清晰的!

    ××××××××××××××××××××××××××××××××××××××××××××××××

      1 #include <stdio.h>
      2 #include <string.h>
      3 char tmp[1000000+10];
      4 int p,q,r,s,t;
      5 int l;
      6 struct res{
      7     int pos;
      8     int res;
      9 };
     10 struct res haha(int begin){
     11     char SIGN=tmp[begin];
     12     struct res rr;
     13     int a,b;   /*   操作的值  */
     14     int pos;
     15     struct res tt;
     16     if(SIGN=='N'){
     17         pos=begin+1;
     18         /* 
     19          * 找N操作的a值
     20          *
     21          * 其他操作寻值跟这个一样
     22          *
     23          * 
     24          */
     25         /* 情况 1 */
     26         if(tmp[pos]=='0'||tmp[pos]=='1'){
     27             a=tmp[pos]-'0';
     28             pos=pos;
     29         }else{
     30         /* 情况 2 */
     31             tt=haha(pos);
     32             a=tt.res;
     33             pos=tt.pos;
     34         }
     35         if(a==0) rr.res=1;
     36         else     rr.res=0;
     37         rr.pos=pos;
     38         return rr;
     39     }
     40     else{
     41         /*
     42          * 这里寻值跟上面不同的是,这个要寻找两个值,a,b
     43          *
     44          * 第一次寻找a,然后用得到的信息开始寻找b
     45          *
     46          * 思路是一样的 
     47          *
     48          */
     49         pos=begin+1;
     50         if(tmp[pos]=='0'||tmp[pos]=='1'){
     51             a=tmp[pos]-'0';
     52             pos=pos+1;
     53         }else{
     54             tt=haha(pos);
     55             a=tt.res;
     56             pos=tt.pos+1;
     57         }
     58         if(tmp[pos]=='0'||tmp[pos]=='1'){
     59             b=tmp[pos]-'0';
     60         }else{
     61             tt=haha(pos);
     62             b=tt.res;
     63             pos=tt.pos;
     64         }
     65     }
     66     rr.pos=pos;
     67     
     68     if(SIGN=='K'){
     69         if(a*b>0)
     70             rr.res=1;
     71         else rr.res=0;
     72     }else if(SIGN=='A'){
     73         if(a+b>0) rr.res=1;
     74         else      rr.res=0;
     75     }else if(SIGN=='C'){
     76         if(a<=b) rr.res=1;
     77         else     rr.res=0;
     78     }else if(SIGN=='E'){
     79         if(a==b) rr.res=1;
     80         else     rr.res=0;
     81     }
     82     return rr;
     83 
     84 }
     85 
     86 int iff(char str[]){
     87     l=strlen(str);
     88     int i;
     89     struct res sum;
     90     for(p=0;p<=1;++p)
     91     for(q=0;q<=1;++q)
     92     for(r=0;r<=1;++r)
     93     for(s=0;s<=1;++s)
     94     for(t=0;t<=1;++t){
     95         strcpy(tmp,str);
     96         for(i=0;i<l;++i){
     97             if(tmp[i]=='p') tmp[i]='0'+p;
     98             else if(tmp[i]=='q') tmp[i]='0'+q;
     99             else if(tmp[i]=='r') tmp[i]='0'+r;
    100             else if(tmp[i]=='s') tmp[i]='0'+s;
    101             else if(tmp[i]=='t') tmp[i]='0'+t;
    102         }
    103         sum=haha(0);
    104         if(sum.res==0) return 0;
    105     }
    106     return 1;
    107 }
    108 int main(){
    109     char str[1000000+10];
    110     int rres;
    111     while(~scanf("%s",str)){
    112         if(str[0]=='0') break;
    113         if(strlen(str)==1){ printf("not
    ");continue;}
    114         rres=iff(str);
    115         if(rres==1) printf("tautology
    ");
    116         else       printf("not
    ");
    117     }
    118     return 0;
    119 }
  • 相关阅读:
    剑指offer-整数中1出现的次数
    数据流中的中位数
    二叉搜索树的后序遍历序列
    Java 线程阻塞和唤醒
    Java 线程池
    Python哈希表和解析式
    Python线性数据结构
    python 基础知识
    pyenv虚拟环境管理python多版本和软件库
    Paramiko的SSH和SFTP使用
  • 原文地址:https://www.cnblogs.com/symons1992/p/3554792.html
Copyright © 2020-2023  润新知