游戏规则,给定一个字符串数组,初始行走方向向右,每经过一个自然数,得分加上自然数,自然数减一,遇到>则行走方向向右,<则行走方向向左,若遇到>或者<号的下一个位置也是大于小于号,则删除当前位置,数组容量减一。若走出边界则游戏终止,输出最终得分。
输入n,m,q;
然后输入长度为n的字符串数组,数组中元素为>,<或者自然数,数组中自然数最大不超过m。
然后输入q对表示左边界和右边界的元素位置,输出得分。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<sstream>
#include<stack>
using namespace std;
string tostring(int a){
stringstream ss;
ss<<a;
string res;
ss>>res;
return res;
}
int toint(string & a){
stringstream ss;
ss<<a;
int res;
ss>>res;
return res;
}
int search(vector<string>arr,int left,int right){
stack<string>st_left;
stack<string>st_right;
for(int i=right;i>=left;i--){
st_left.push(arr[i]);
}
int res=0;
int flag=1;
while(true){
if(flag==1){
if(st_left.empty()){
break;
}
string tmp=st_left.top();
if(tmp=="<"){
flag=-1;
if(!st_right.empty()&&(st_right.top()==">"||st_right.top()=="<"))
st_left.pop();
continue;
}
else if(tmp==">"){
flag=1;
st_left.pop();
if(!st_left.empty()&&(st_left.top()==">"||st_left.top()=="<"))
continue;
st_right.push(tmp);
}
else{
if(tmp=="0")
{
st_left.pop();
continue;
}
res += toint(tmp);
st_left.pop();
tmp = tostring(toint(tmp)-1);
st_right.push(tmp);
}
}
else{
if(st_right.empty()){
break;
}
string tmp=st_right.top();
if(tmp==">"){
flag=1;
if(!st_left.empty()&&(st_left.top()==">"||st_left.top()=="<"))
st_right.pop();
continue;
}
else if(tmp=="<"){
flag=-1;
st_right.pop();
if(!st_right.empty()&&(st_right.top()==">"||st_right.top()=="<"))
continue;
st_left.push(tmp);
}
else{
if(tmp=="0")
{
st_right.pop();
continue;
}
res += toint(tmp);
st_right.pop();
tmp = tostring(toint(tmp)-1);
st_left.push(tmp);
}
}
}
return res;
}
int main ()
{
int n,m,q;
cin>>n>>m>>q;
vector<string>arr(n);
for(int i=0;i<n;i++){
cin>>arr[i];
}
for(int i=0;i<q;i++){
int left,right;
cin>>left>>right;
cout<<search(arr,left-1,right-1)<<endl;
}
return 0;
}