zoukankan      html  css  js  c++  java
  • 洛谷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;					
    }
    
  • 相关阅读:
    linux——系统内核参数优化
    nginx 开启高效文件传输模式
    nginx——Nginx 处理事件模型
    Nginx 单个进程允许的最大连接数
    nginx传世经典
    Python中常见的数据类型总结(二)
    Python中常见的数据类型总结(一)
    Web压力测试工具 webbench
    性能测试概念点分析与过程讲解(四)--抓包
    性能测试概念点分析与过程讲解(三)
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/11349668.html
Copyright © 2011-2022 走看看