社区讨论

样例过了,但0pts,下了个数据点,答案是对的,why

P5756 [NOI2000] 程序分析器参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo1p9bq0
此快照首次捕获于
2023/10/23 00:45
2 年前
此快照最后确认于
2023/11/03 01:25
2 年前
查看原帖
rt
Code:Code:
CPP
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
string Code[3000+5];
bool Code_Ending;
int cnt,nxt[3000+5];
#define INF 1e7//阈值 
int get_int(string s,int l,int r){
	int ret=0;
	for(int i=l;i<=r;i++)ret=(ret*10)+(s[i]-'0');
	return ret;
}
map<char ,int> var;
int now,f;
void running(int x){
	cnt++;//先累加 
	if(Code[x]=="END"){//结束句 
		cout<<cnt<<endl;
		exit(0);
	}
	if(cnt>INF){//死循环 
		cout<<"-1\n";
		exit(0);
	}
	string s=Code[x];
	for(int i=0;i<s.length();i++){
		if(s[i]=='I'&s[i+1]=='F'){
			char c;
			c=s[i+3];
			int k=0;
			for(i=i+5;s[i]!=' ';i++)k=(k*10)+(s[i]-'0'); 
			i+=4;//跳过 GO,此时 i 指向转移语句 
			int gowhr=get_int(s,i,s.length()-1);
			if(var[c]==k){
				f=0;now=gowhr;break;
			}
		}
		else if(s[i]=='G'&s[i+1]=='O'){
			int gowhr=get_int(s,i+3,s.length()-1);
			f=0;now=gowhr;break;
		}else if(s[i]=='+'){
			var[s[i-1]]+=(s[i+1]-'0');
			f=0;now=nxt[x];break;
		}else if(s[i]=='?'){
			f=0;now=nxt[x];break;
		}
	}
}
int main(){
	var.clear();
	int H;
	while(cin>>H){
		getchar();
		getline(cin,Code[H]);
	}
	int last=0;
	for(int i=0;i<=3000;i++){
		if(Code[i]=="")continue;
		nxt[last]=i,last=i;
	}
	for(now=0;now<=3000;){
		if(Code[now]==""){now=nxt[now];continue;}
		f=1;
		running(now);
		if(f)now=nxt[now];
	}
	return 0;
}
下了一个数据点,测出来是对的

回复

0 条回复,欢迎继续交流。

正在加载回复...