UVA 1596 Bug Hunt

Posted fudanxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 1596 Bug Hunt相关的知识,希望对你有一定的参考价值。

题意:

技术图片
思路:来自:https://blog.csdn.net/guozlh/article/details/53209339

利用map<pair<char,int>,int>模拟数组,map<char,int>用于存放定义数组的长度

定义语句不用考虑,直接模拟存放其长度即可

赋值语句要分别计算等号左边和右边,2种情况:

(1)直接是数字:直接赋值即可

(2)嵌套数组表达式:利用栈进行计算,由里向外逐层计算得出值!

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<map>
  4 #include<vector>
  5 #include<string>
  6 #include<cstring>
  7 #include<stack>
  8 using namespace std;
  9 typedef pair<char, int> position;//数组名+下标
 10 map<position, int>arr;//存放数组的值
 11 map<char, int>arrSize;//存放数组的大小
 12 
 13 bool isDefine(string str)//是否是定义
 14 {
 15     if (str.find("=") == string::npos)//没有找到,返回string::npos
 16         return true;
 17     return false;
 18 }
 19 
 20 int arrLen(string str)//计算数组的长度或下标值
 21 {
 22     int len = 0;
 23     for (int i = 0; i < str.length(); i++)
 24     {
 25         if (str[i] == ])
 26             break;
 27         if (str[i] >= 0&&str[i] <= 9)
 28         {
 29             len = len * 10;
 30             len += str[i] - 0;
 31         }
 32     }
 33     return len;
 34 }
 35 
 36 stack<char>sac;//用于计算嵌套数组
 37 
 38 bool findValue(string str, int &index, int start)
 39 {
 40     while (!sac.empty())//清空栈
 41     {
 42         sac.pop();
 43     }
 44     //=后面是数字
 45     if (str[start] >= 0&&str[start] <= 9)
 46     {
 47         index = arrLen(str);//求值
 48         return true;
 49     }
 50     else//嵌套的
 51     {
 52         int index2 = 0;
 53         char name;
 54         for (int i = start; i < str.length();)//遍历拆解
 55         {
 56             if (str[i] == [ || str[i] == ])
 57                 i++;
 58             else if (str[i] <= 9&&str[i] >= 0)//遇到数字,算值
 59             {
 60                 while (str[i] >= 0&&str[i] <= 9)
 61                 {
 62                     index2 *= 10;
 63                     index2 += str[i] - 0;
 64                     i++;
 65                 }
 66                 break;//找到数字就出来不需要管后面的]]]] 
 67             }
 68             else//数组名入栈
 69                 sac.push(str[i++]);
 70         }
 71         //拆解完,由内向外计算
 72         while (!sac.empty())
 73         {
 74             name = sac.top();
 75             sac.pop();
 76             if (arrSize[name] > index2)//没有越界
 77             {
 78                 //被初始化过
 79                 if (arr.count(position(name, index2)) != 0)
 80                     index2 = arr[position(name, index2)];
 81                 else
 82                     return false;//没有被初始化
 83             }
 84             else
 85                 return false;//越界
 86         }
 87         index = index2;//把求得的值传回
 88     }
 89     return true;
 90 }
 91 
 92 bool solve(string str)
 93 {
 94     if (isDefine(str))//定义还是赋值
 95     {
 96         arrSize[str[0]] = arrLen(str);//存放数组的大小
 97     }
 98     else//赋值
 99     {
100         char arrName = str[0];
101         int arrIndex;
102         findValue(str, arrIndex, 2);//计算下标,a[3],下标2就是3
103         if (arrIndex >= arrSize[arrName])
104             return false;//越界
105         int start = str.find("=") + 1;
106         int values;
107         string tempStr = str.substr(start, str.length() - start);
108         if (str[start] >= 0&&str[start] <= 9)//=后面直接是数字
109             values = arrLen(tempStr);
110         else//等于后面是嵌套数组的
111         {
112             values = 0;
113             if (!findValue(str, values, start))
114                 return false;
115         }
116         arr[position(arrName, arrIndex)] = values;//数组赋值
117     }
118     return true;
119 }
120 
121 int main()
122 {
123     string str;
124     bool noBug;
125     int res;
126     while (cin>>str&&str!=".")
127     {
128         noBug = true;
129         int cnt = 1;
130         if (!solve(str))//第一行
131         {
132             noBug = false;
133             res = cnt;
134         }
135         while (cin>>str&&str!=".")
136         {
137             cnt++;
138             if (noBug)
139             {
140                 if (!solve(str))
141                 {
142                     noBug = false;
143                     res = cnt;
144                 }
145             }
146         }
147         if (noBug)
148             cout << "0
";
149         else
150             cout << res << endl;
151         arr.clear();
152         arrSize.clear();
153     }
154     return 0;
155 }

 












以上是关于UVA 1596 Bug Hunt的主要内容,如果未能解决你的问题,请参考以下文章

UVA 1596 Bug Hunt

UVA 1596 Bug Hunt (大模拟 栈)

UVa 1596 Bug Hunt (STL栈)

习题5_9 找bug(Bug Hunt, ACM/ICPC Tokyo 2007, UVa1596)

UVa 1596 Bug Hunt (string::find && map && 模拟)

vscode代码片段建议bug