POJ - 3746 Teacher YYF 思维 STL

POJ - 3746 Teacher YYF

题意:

给你n个词 和 m条句子。根据题目给定的语法判断句子是否有错误。

思路:

用map将单词与句子一步步转换

参考博客:https://blog.csdn.net/wl16wzl/article/details/79245191

题目中的介词短语为 介词+名词或代词   ,但是在提交时介次短语中介词与名词的中间需要加上一个冠词 才对。。。

#include
#include
#include
#include
#include
#include
#include
using namespace std;
map fun; //把每种词标号
map num; //将题目中给出的词标号
map str; //记录每种主语宾语谓语介词短语的每种形式,打表
map ste; //每种句子形式,打表
void init()
{
	fun["n."]=0;
	fun["pron."]=1;  //代词
	fun["adj."]=2;
	fun["adv."]=3;
	fun["prep."]=4;  //介词
	fun["art."]=5;   //冠词
	fun["vt."]=6;
	fun["vi."]=7;
	fun["v."]=8;

	str["450"]='A'; //介词短语
	str["42"]='A';
	str["41"]='A';
	str["1"]='S'; //主语或宾语
	str["50"]='S';
	str["520"]='S';
	str["7"]='I'; //不及物(谓语)
	str["37"]='I';
	str["6"]='T'; //及物(谓语)
	str["36"]='T';
	str["8"]='V'; //通用(谓语)
	str["38"]='V';
	//句子可能的总体结构
	ste["SI"]=1;   //主+谓
	ste["SV"]=1;

	ste["STS"]=1;  //主+谓+宾
	ste["SVS"]=1;

	ste["ASI"]=1;  //介+主+谓
	ste["ASV"]=1;

	ste["ASTS"]=1;  //介+主+谓+宾
	ste["ASVS"]=1;

	ste["SAI"]=1;  //主+介+谓
	ste["SAV"]=1;

	ste["SATS"]=1;  //主+介+谓+宾
	ste["SAVS"]=1;

	ste["SIA"]=1;  //主+谓+介
	ste["SVA"]=1;

	ste["STAS"]=1;  //主+谓+介+宾
	ste["SVAS"]=1;

	ste["STSA"]=1;  //主+谓+宾+介
	ste["SVSA"]=1;
}
int n,m;
int main()
{
    ios::sync_with_stdio(0);
	string a,b;
	init();
	scanf("%d%d",&n,&m);
	while(n--)
	{
		cin>>a>>b;
		num[a]=fun[b];
	}
	while(m--)
	{
		bool flag=false;
		b="";
		while(cin>>a) //转化为词性表示
		{
			if(isupper(a[0])) a[0]=a[0]+32;  //检验首字母是否为大写
			int len=a.length();
			if(a[len-1]=='.')
			{
				flag=true;
				a.erase(len-1,1);
			}
			if(a[len-1]==',') a.erase(len-1,1);
			b+='0'+num[a];
			if(flag) break;
		}
		//cout<<"b;"<

 

你可能感兴趣的:(STL,思维,map)