zoukankan      html  css  js  c++  java
  • bzoj1238

    题解:

    傻逼模拟题

    果断的复制了题解(还没有c++题解?)

    代码:

    program p2509;
    type arr=array[1..26] of boolean;
    var tot:longint;
        s:array[1..100] of ansistring;
        b:arr;
    procedure init;
    begin
      tot:=0;
      while not eof do
      begin
        inc(tot);
        readln(s[tot]);
      end;
    end;
    procedure warn1(n:longint;c:char);
    begin
      writeln('Line ',n,': variable ',c,' might not have been initialized');
    end;
    procedure warn2(n:longint);
    begin
      writeln('Line ',n,': unreachable code');
    end;
    function judge(str:ansistring):longint;
    begin
      if str[2]='F' then
        exit(3)
      else if str[2]='E' then
        exit(2)
      else if str[2]='L' then
        exit(4)
      else if str[2]='N' then
        exit(5)
      else
        exit(1);
    end;
    function dfs(var k:longint;var c:arr):boolean;
    var d,e,c1,c2:arr;
        str:ansistring;
        i,j,sum:longint;
        a:array[1..26] of longint;
        b1,b2:boolean;
    begin
      d:=c;
      while k<=tot do
      begin
        str:=s[k];
        if judge(str)=1 then                                                                                                 //赋值语句
        begin
          fillchar(a,sizeof(a),0);
          for i:=5 to length(str) do
            if (str[i]>='A') and (str[i]<='Z') and not c[ord(str[i])-64] then
              inc(a[ord(str[i])-64]);
          for i:=1 to 26 do
            if a[i]>0 then
              warn1(k,chr(i+64));
          c[ord(str[1])-64]:=true;
        end
        else if judge(str)=2 then                                                                                        //return语句
        begin
          fillchar(a,sizeof(a),0);
          for i:=8 to length(str) do
            if (str[i]>='A') and (str[i]<='Z') and not c[ord(str[i])-64] then
              inc(a[ord(str[i])-64]);
          for i:=1 to 26 do
            if a[i]>0 then
              warn1(k,chr(i+64));
          sum:=0;
          j:=k;
          inc(k);
          while k<=tot do
          begin
            str:=s[k];
            if judge(str)=3 then inc(sum);
            if sum=0 then
            if (str[2]='L') or (str[2]='N') then
            begin
              for i:=j+1 to k-1 do
                if judge(s[i])<=3 then warn2(i);
              c:=d;
              exit(true);
            end;
          if str[2]='N' then dec(sum);
          inc(k);
        end;
        if k>tot then
          for i:=j+1 to tot do
            if judge(s[i])<=3 then warn2(i);
        end
        else if judge(str)=3 then                                                                                      //if语句
        begin
          j:=3;
          while copy(str,j,4)<>'THEN' do
            inc(j);
          fillchar(a,sizeof(a),0);
          for i:=3 to j-1 do
            if (str[i]>='A') and (str[i]<='Z') and not c[ord(str[i])-64] then
              inc(a[ord(str[i])-64]);
          for i:=1 to 26 do
            if a[i]>0 then
              warn1(k,chr(i+64));
          e:=c;
          inc(k);
          b1:=dfs(k,c);
          c1:=c;
          c:=e;
          if judge(s[k])=4 then
          begin
            inc(k);
            b2:=dfs(k,c);
            c2:=c;
            c:=e;
            if b1 and not b2 then
              c:=c2
            else if not b1 and b2 then
              c:=c1
            else if not b1 and not b2 then
            begin
              for i:=1 to 26 do
                if c1[i] and c2[i] then c[i]:=true;
            end;
            b1:=b1 and b2;
          end
          else
            b1:=false;
          if b1 then
          begin
            sum:=0;
            j:=k;
            inc(k);
            while k<=tot do
            begin
              str:=s[k];
              if judge(str)=3 then inc(sum);
              if sum=0 then
              if (str[2]='L') or (str[2]='N') then
              begin
                for i:=j+1 to k-1 do
                  if judge(s[i])<=3 then warn2(i);
                c:=d;
                exit(true);
              end;
              if str[2]='N' then dec(sum);
              inc(k);
            end;
            if k>tot then
              for i:=j+1 to tot do
                if judge(s[i])<=3 then warn2(i);
          end;
        end
        else if judge(str)=4 then                                                                             //else语句
        begin
          exit(false);
        end
        else if judge(str)=5 then                                                                              //end if语句
        begin
          exit(false);
        end;
        inc(k);
      end;
    end;
    procedure main;
    var i,l:longint;
        bool:boolean;
    begin
      l:=length(s[1]);
      fillchar(b,sizeof(b),false);
      for i:=7 to l do
        if (s[1][i]>='A') and (s[1][i]<='Z') then
          b[ord(s[1][i])-64]:=true;
      i:=2;
      bool:=dfs(i,b);
    end;
    begin
      init;
      main;
    end.
  • 相关阅读:
    洛谷 P1725 琪露诺 题解
    洛谷 P1714 切蛋糕 题解
    洛谷 P1352 没有上司的舞会 题解
    洛谷 P1194 买礼物 题解
    洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解
    OpenCV之头文件分析
    电路学习之二极管(一)
    二极管学习(一)
    STL之vetor 排序
    小波分析(二)
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8473302.html
Copyright © 2011-2022 走看看