⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1614.txt

📁 北大ACM题目例程 详细的解答过程 程序实现 算法分析
💻 TXT
字号:


#include"stdio.h"
#include"queue"
#include"set"
#include"list"
using namespace std;

struct node
{
	enum {human,romulan,shield} kind;
	int l,u;
}v[100010];

int n,m;
list<int> e[100010];

void init()
{
	char w[100];
	int a,s,i,b;

	scanf("%d %d",&n,&m);
	
	scanf("%s",w);
	scanf("%d",&s);
	
	for(i=0;i<s;i++)
	{
		scanf("%d",&a);
		v[--a].kind=node::human;
		e[a].clear();
	}

	scanf("%s",w);
	scanf("%d",&s);

	for(i=0;i<s;i++)
	{
		scanf("%d",&a);
		v[--a].kind=node::romulan;
		e[a].clear();
	}

	scanf("%s",w);
	scanf("%d",&s);

	for(i=0;i<s;i++)
	{
		scanf("%d",&a);
		v[--a].kind=node::shield;
		e[a].clear();

		scanf("%d %d",&v[a].l,&v[a].u);
	}

	scanf("%s",w);
	scanf("%d",&s);

	for(i=0;i<s;i++)
	{
		scanf("%d %d",&a,&b);
		a--,b--;
		e[a].push_back(b);
	}

	return ;
}

set<int> s[1001];

struct bomb
{
	int q;
	int at;
};
queue<bomb> qu;

void doit()
{
	char w[100];
	int p,i,ans,begin,q,dq;
	list<int>::iterator iter;
	bool key;
	bomb b,bt;


	scanf("%s",w);
	scanf("%d",&p);

	ans=0;
	while(p--)
	{
		scanf("%d %d %d",&begin,&q,&dq);
		begin--;

		while(!qu.empty())qu.pop();
		for(i=0;i<=1000;i++)
			s[i].clear();

		b.q=q;b.at=begin;
		qu.push(b);
		s[b.q].insert(b.at);

		key=1;

		while(!qu.empty()&&key)
		{
			b=qu.front();
			qu.pop();

			for(iter=e[b.at].begin();iter!=e[b.at].end();iter++)
			{
				if(v[*iter].kind==node::romulan)
				{
					ans++,key=0;
					break;
				}
				else if(v[*iter].kind==node::human)
				{
					if(s[b.q].find(*iter)==s[b.q].end())
					{
						bt.at=*iter,bt.q=b.q;
						s[b.q].insert(bt.at);
						qu.push(bt);
					}
					if(v[b.at].kind==node::shield)
					{
						bt.q=b.q+dq,bt.at=*iter;
						if(bt.q<=1000&&s[bt.q].find(*iter)==s[bt.q].end())
						{	
							s[bt.q].insert(bt.at);
							qu.push(bt);
						}

						bt.q=b.q-dq;
						if(bt.q>=0&&s[bt.q].find(*iter)==s[bt.q].end())
						{	
							s[bt.q].insert(bt.at);
							qu.push(bt);
						}
					}
				}
				else 
				{
					bt.q=b.q;bt.at=*iter;
					if(bt.q<=v[bt.at].u&&bt.q>=v[bt.at].l&&s[bt.q].find(bt.at)==s[bt.q].end())
					{
						s[bt.q].insert(bt.at);
						qu.push(bt);
					}
					
					if(v[b.at].kind==node::shield)
					{
						bt.q=b.q+dq;
						if(bt.q<=v[bt.at].u&&bt.q>=v[bt.at].l&&s[bt.q].find(bt.at)==s[bt.q].end())
						{
							s[bt.q].insert(bt.at);
							qu.push(bt);
						}

						bt.q=b.q-dq;
						if(bt.q<=v[bt.at].u&&bt.q>=v[bt.at].l&&s[bt.q].find(bt.at)==s[bt.q].end())
						{
							s[bt.q].insert(bt.at);
							qu.push(bt);
						}
					}
				}
			}//for
		}//while

		
	}//while
	
	printf("%d\n",ans);
	
	return ;
}

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		init();
		doit();
	}

	return 0;
}

				



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -