UVa:1596 - Bug Hunt

題目描述:

輸入並模擬一段程序,輸出第一個bug所在的行。每行程序有兩種可能:

數組定義:格式爲arr[size],例如a[10];

賦值語句:格式爲arr[index]=value,例如a[0]=3或者a[a[0]]=3

賦值語句可能會出現兩種bug:下標index越界,使用未初始化變量。


思路:本題有兩個關鍵點,首先在於程序中已經出現的數組以及已經賦值過的元素的存儲,可以採用兩個map完成,map<string,int>存儲數組名和數組大小,map<string,map<int,int>>存儲數組名以及其對應的已經賦值過得元素。其次在於計算數組的下標(下標的值可能是多層嵌套),這裏可以利用棧輕鬆完成。


另外,前兩次提交一直WA,原來是忘了在新的程序清空map,程序如下:


#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <sstream>
#include <fstream>
#include <stack>

using namespace std;

map<string, long long> array_table;
map<string,map< long long, long long>> array_value_table;

#define FILE


void partition(string origin,string &left,string &right)
{
	int index = origin.find_first_of('=',0);
	if(index!=-1)
	{
		left = origin.substr(0,index);
		right = origin.substr(index+1);
	}
	else
	{
		left = origin;
		right = "";
	}
}

void getArray(string str,string &name, string &value)
{
	int begin = str.find_first_of('[',0);
	int end = str.find_last_of(']');
	if(begin!=-1)
	{
		name = str.substr(0,begin);
		value = str.substr(begin+1,end-begin-1);
	}
	else
	{
		name = "";
		value = str;
	}
}

bool isValue(string value)
{
	int index = value.find_first_of('[',0);
	if(index!=-1)
		return true;
	return false;
}

long long calculateArray(string str)
{
	string name,value;
	getArray(str,name,value);
	stack<string> s;
	long long ans;
	while(name!="")
	{
		string left,right;
		getArray(value,left,right);
		if (array_table.count(name)==0)
		{ 
			return -1;
		}
		value = right;
		s.push(name);
		name = left;

	}
	ans = atoi(value.c_str());
	if(ans<0)
		return -1;
	while (!s.empty())
	{
		string left = s.top();
		long long num = array_table[left];
		if(ans>=num)
			return -1;
		if(array_value_table[left].count(ans)==0)
			return -1;
		ans = array_value_table[left][ans];
		s.pop();
	}
	return ans;
}

int main(int argc, char* argv[])
{
#ifdef FILE
	ifstream in("data.txt");
	ofstream out("output.txt");
	cin.rdbuf(in.rdbuf());
	cout.rdbuf(out.rdbuf());
#endif
	string str;
	bool mark = false,isfirst = true;
	int num = 0;
	while(cin>>str)
	{
		if(str!=".")
		{
			mark = false;
			num++;
			string left,right;
			partition(str,left,right);
			if(right=="")
			{
				string name,value;
				getArray(left,name,value);
				array_table[name] = atoi(value.c_str());
			}
			else
			{
				string name, value;
				long long ans,temp;
				getArray(left,name,value);
				temp = calculateArray(value);
				ans = calculateArray(right);
				if(temp>=0&&temp<array_table[name]&&ans!=-1)
				{
					array_value_table[name][temp] = ans;
				}
				else
				{
					if(isfirst)
					{
						cout<<num<<endl;
						isfirst = false;
					}
				}
			}
		}
		else
		{
			array_table.clear();
			array_value_table.clear();
			if(mark)
				break;
			else
			{
				if(isfirst)
					cout<<0<<endl;
				mark = true;
				isfirst = true;
				num = 0;
			}
		}
	}
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章