洛谷P5506 封锁

题目

一道模拟题,问题不是很大,主要需要读题清晰,且算法的操作顺序要搞明白,比如在每一秒的开始,所有无人机移动,然后再一步一步操作。

然后就是判断方向是否一致了,细节还是很多的。

#include <bits/stdc++.h>
using namespace std;
int n, t;
struct dir {
	int x, y, z;
}fh[90][90];
struct fly {  
	int x, y, z, h, f, atk, def, mat, mdf, hp, fix, flag;
	char c[1210];
}a[1210];	 
inline void add(int a, int b, int x, int y, int z)
{			 
	fh[a][b].x = x, fh[a][b].y = y, fh[a][b].z = z;
}			 
inline void init()
{			 
	for (int i = 0; i <= 7; i++)
		fh[i][0].x = 0, fh[i][0].y = 0, fh[i][0].z = -1;
	for (int i = 0; i <= 7; i++)
		fh[i][4].x = 0, fh[i][4].y = 0, fh[i][4].z = 1;
	add(0, 1, 1, 0, -1), add(0, 2, 1, 0, 0), add(0, 3, 1, 0, 1);
	add(1, 1, 1, 1, -1), add(1, 2, 1, 1, 0), add(1, 3, 1, 1, 1);
	add(2, 1, 0, 1, -1), add(2, 2, 0, 1, 0), add(2, 3, 0, 1, 1);
	add(3, 1, -1, 1, -1), add(3, 2, -1, 1, 0), add(3, 3, -1, 1, 1);
	add(4, 1, -1, 0, -1), add(4, 2, -1, 0, 0), add(4, 3, -1, 0, 1);
	add(5, 1, -1, -1, -1), add(5, 2, -1, -1, 0), add(5, 3, -1, -1, 1);
	add(6, 1, 0, -1, -1), add(6, 2, 0, -1, 0), add(6, 3, 0, -1, 1);
	add(7, 1, 1, -1, -1), add(7, 2, 1, -1, 0), add(7, 3, 1, -1, 1);
	scanf("%d%d", &n, &t);
}
int main()
{	
	init();
	for (int j = 1; j <= n; j++)
	{
		int x, y, z, h, f, atk, def, mat, mdf, hp, fix;
		scanf("%d%d%d%d%d%d%d%d%d%d%d", &a[j].x, &a[j].y, &a[j].z, &a[j].h, &a[j].f, &a[j].atk, &a[j].def, &a[j].mat, &a[j].mdf, &a[j].hp, &a[j].fix);
		for (int i = 1; i <= t; i++)
			cin >> a[j].c[i];
	}
	for (int i = 1; i <= t; i++)
	{
		for (int j = 1; j <= n; j++)
			if (a[j].flag == 0)
			{
				a[j].x += fh[a[j].f][a[j].h].x;
				a[j].y += fh[a[j].f][a[j].h].y;
				a[j].z += fh[a[j].f][a[j].h].z;	
			}
		for (int j = 1; j <= n; j++)
		{
			if (a[j].hp <= 0 && a[j].flag == 0)
			{								
				a[j].hp = 0;
				a[j].flag = -1;
			}
			if (a[j].flag == -1)
				continue;
			if (a[j].c[i] == 'N')
				continue;
			if (a[j].c[i] == 'U' && a[j].h != 4)
				a[j].h++;
			if (a[j].c[i] == 'D' && a[j].h != 0)
				a[j].h--;
			if (a[j].c[i] == 'L')
			{
				if (a[j].f == 7)
				a[j].f = 0;
				else
					a[j].f++;
			}		
			if (a[j].c[i] == 'R')
			{		
			    if (a[j].f == 0)
				a[j].f = 7;
				else
			    	a[j].f--;
			}		
			if (a[j].c[i] == 'F')
				a[j].hp += a[j].fix;
			if (a[j].c[i] == 'A')
			{   
				for (int k = 1; k <= n; k++)
				{
					if (k == j || a[k].flag) continue;
					int delx, dely, delz, delp;
					delx = a[k].x - a[j].x;
					dely = a[k].y - a[j].y;
					delz = a[k].z - a[j].z;
					if (delx == 0 && dely == 0 && delz == 0) continue;	
					delp = max(0, a[j].atk - a[k].def);
					if ((delx == 0 && fh[a[j].f][a[j].h].x != 0) || (delx != 0 && fh[a[j].f][a[j].h].x == 0)) continue;
				 	if ((dely == 0 && fh[a[j].f][a[j].h].y != 0) || (dely != 0 && fh[a[j].f][a[j].h].y == 0)) continue;
				 	if ((delz == 0 && fh[a[j].f][a[j].h].z != 0) || (delz != 0 && fh[a[j].f][a[j].h].z == 0)) continue;
					int fx = -1, fy = -1, fz = -1;
					if (delx != 0)			
						fx = (delx / fh[a[j].f][a[j].h].x);
					else					
						fx = 0;				
					if (dely != 0)			
						fy = (dely / fh[a[j].f][a[j].h].y);
					else 
						fy = 0;
					if (delz != 0)
						fz = (delz / fh[a[j].f][a[j].h].z);
					else
						fz = 0;
					if (fx < 0 || fy < 0 || fz < 0) continue;//如果在同一方向,但是还是不准确,具体体现在还要在相同的
					if (fx == 0 && fy == 0)
					{
						a[k].hp -= delp;
						break;
					}						
					if (fy == 0 && fz == 0)
					{
						a[k].hp -= delp;
						break;
					}
					if (fx == 0 && fz == 0)
					{
						a[k].hp -= delp;	
						break;
					}
					if (fz == fy && fy == fx)
				 	{
				 		a[k].hp -= delp;
				 		break;
					}
					if (fx != fy && fx != 0 && fy != 0) continue;
					if (fx != fz && fx != 0 && fz != 0) continue;
					if (fz != fy && fz != 0 && fy != 0) continue;
    				a[k].hp -= delp;
					break;
				}
		   	}	
	       	if (a[j].c[i] == 'M') // 判断方向 
		   	{		
				for (int k = 1; k <= n; k++)
				{	
					if (k == j || a[k].flag) continue;
					int delx, dely, delz, delp;
					delx = a[k].x - a[j].x;
					dely = a[k].y - a[j].y;
					delz = a[k].z - a[j].z;
					if (delx == 0 && dely ==  0 && delz == 0) continue;
					delp = max(0, a[j].mat - a[k].mdf);
					if ((delx == 0 && fh[a[j].f][a[j].h].x != 0) || (delx != 0 && fh[a[j].f][a[j].h].x == 0)) continue;//如果一个数动了,一个数没动,就不行。 
				 	if ((dely == 0 && fh[a[j].f][a[j].h].y != 0) || (dely != 0 && fh[a[j].f][a[j].h].y == 0)) continue;//同理 
				 	if ((delz == 0 && fh[a[j].f][a[j].h].z != 0) || (delz != 0 && fh[a[j].f][a[j].h].z == 0)) continue;
				 	int fx = -1, fy = -1, fz = -1;
				 	if (delx != 0) 
				 		fx = (delx / fh[a[j].f][a[j].h].x);
				 	else
				 		fx = 0;
				 	if (dely != 0)
				 		fy = (dely / fh[a[j].f][a[j].h].y);
				 	else
				 		fy = 0;
				  	if (delz != 0)
				 		fz = (delz / fh[a[j].f][a[j].h].z);
				 	else
				 		fz = 0;
				 	if (fx < 0 || fy < 0 || fz < 0) continue;// 如果有一个方向不 
				 	if (fx == 0 && fy == 0)//
				 	{	 
				 		a[k].hp -= delp;
				 		continue;
				 	}	 
				 	if (fy == 0 && fz == 0)  	
				 	{	 
				 		a[k].hp -= delp;
				 		continue;
				 	}	 
				 	if (fx == 0 && fz == 0) 
					{	 
				   		a[k].hp -= delp;	
				 		continue;
				 	}	 
				 	if (fx != fy && fx != 0 && fy != 0) continue;
				 	if (fx != fz && fx != 0 && fz != 0) continue;
				 	if (fz != fy && fz != 0 && fy != 0) continue;
				 	if (fz == fy && fy == fx)
				 	{
				 		a[k].hp -= delp;
				 		continue;	
					}					  
				 		a[k].hp -= delp;
				}		
			}			
		}			                                                                             	
    }					
	for (int i = 1; i <= n; i++)
		printf("%d %d %d %d
", a[i].x, a[i].y, a[i].z, a[i].hp);
	return 0;					
}
原文地址:https://www.cnblogs.com/liuwenyao/p/11349668.html