做(一道dfs题)

做(一道dfs题)

做(一道dfs题)

做(一道dfs题)

我们先看香港记者,最优,那他一定会走到使魔法师攻击值最小的地方。

我们再来看魔法师,魔法师的移动其实是没有用的,如果魔法师移动,魔法师和香港记者的距离缩小。魔法师的攻击值比移动前还小,没啥用啊。所以魔法师根本不移动!

我们再来看看魔法师的恢复操作,魔法师越晚恢复越好,因为魔法师和香港记者的距离会越来越近,产生的伤害会越来越少。

所以趁着伤害高的时候能多打就多打香港记者。

如果香港记者的森破值小于等于0,魔法师赢。

如果魔法师的膜法值小于a,并且恢复值为0 ,或者魔法师和香港记者在同一位置,香港记者赢。

因为每轮,魔法师先操作,所以先判断魔法师赢的条件

#include<bits/stdc++.h>
using namespace std;
int x,y,xx,yy,c,d,a,b,he,hehe,ans,zong;
void read(int &x)
{
	x = 0;  int f = 0;  char c = getchar();
	while(c < '0' || c > '9')
	{
		if(c == '-') f = 1; 	c  = getchar();
	}
	while(c >= '0' && c <= '9')
	{
		x = x * 10 + c - '0'; c = getchar();
	}
	if(f) x = -x ;
}
void dfs(int x1,int y1,int x2,int y2,int cc,int dd,int s)
{
	if(s > zong) return ;
	if(dd <= 0) {
		ans = 0; return;
	}
	if(((cc < a && b == 0) && dd > 0) || (x1 == x2 && y1 == y2))
	{
		ans = 1; return;
	}
	int zou = 0;
	long long ha = abs(x2 - x1);long long haha = abs(y1-y2);	int xx2,yy2;
	if(ha == 0)  
	{    
	    xx2=x2;
		if(haha >= 2) y2 > y1 ? yy2 = y2 - 2:yy2 = y2 + 2;
		if(haha == 1) 	y2 > y1 ? yy2 = y2 - 1:yy2 = y2 + 1;
	}
	else if(haha == 0)
	{   
	    yy2=y2;
		if(ha >= 2)   x2 > x1 ?xx2 =  x2 - 2:xx2 = x2 + 2;
		if(ha == 1) 	x2 > x1 ?xx2 =  x2 - 1:xx2 = x2 + 1;
	}
	else if(haha == 1 && ha == 1)
	{
			x2 > x1 ?xx2 =  x2 - 1:xx2 = x2 + 1;
			y2 > y1 ? yy2 = y2 - 1:yy2 = y2 + 1;
	}
	else if(haha == 1 && ha > 1)
	{
		long long  e = (ha - 1) * (ha - 1) + (haha - 1) * (haha - 1);
         long long  ee = (ha - 2) * (ha - 2) + (haha ) * (haha );
          if(e <= ee )
	      {
			x2 > x1 ?xx2 =  x2 - 1:xx2 = x2 + 1;
			y2 > y1 ? yy2 = y2 - 1:yy2 = y2 + 1;
	      }
	      else 
	      {
		   x2 > x1 ?xx2 =  x2 - 2:xx2 = x2 + 2;  yy2=y2;
	      } 
	}
	else if(ha == 1 && haha > 1)
	{
		 long long  e = (ha - 1) * (ha - 1) + (haha - 1) * (haha - 1);
		  long long eee = 	(ha) * (ha) + (haha - 2) * (haha - 2);
		if( e <= eee)
	     {
			x2 > x1 ?xx2 =  x2 - 1:xx2 = x2 + 1;
			y2 > y1 ? yy2 = y2 - 1:yy2 = y2 + 1;
	     }
	     else 	{y2 > y1 ? yy2 = y2 - 2:yy2 = y2 + 2;xx2=x2;
	     } 
	}
	else 
	{
		 long long  e = (ha - 1) * (ha - 1) + (haha - 1) * (haha - 1);
         long long  ee = (ha - 2) * (ha - 2) + (haha ) * (haha );
		  long long eee = 	(ha) * (ha) + (haha - 2) * (haha - 2);
	  if(e <= ee && e <= eee)
	   {
			x2 > x1 ?xx2 =  x2 - 1:xx2 = x2 + 1;
			y2 > y1 ? yy2 = y2 - 1:yy2 = y2 + 1;
	   }
	   else if(ee <= e && ee <= eee)
	   {
		x2 > x1 ?xx2 =  x2 - 2:xx2 = x2 + 2;yy2=y2;
	   } 
	  else {y2 > y1 ? yy2 = y2 - 2:yy2 = y2 + 2;xx2=x2;
	  } 
	}	 
	/*if(ha <= haha)  zou = 1;
	else zou = 0;
    if(zou == 1 )
	{
		if(ha >=2) {x2 > x1 ?xx2 =  x2 - 2:xx2 = x2 + 2;yy2=y2;}
	    else if(ha == 1) {
	    	x2 > x1 ?xx2 =  x2 - 1:xx2 = x2 + 1;
			y2 > y1 ? yy2 = y2 - 1:yy2 = y2 + 1;	
	    }
		else  {y2 > y1 ? yy2 = y2 - 2:yy2 = y2 + 2;xx2=x2;}			
	}
	 else 
	 {
	 	if(haha >=2) {y2 > y1 ? yy2 = y2 - 2:yy2 = y2 + 2;xx2=x2;}	
	    else if(ha == 1) {
	    	x2 > x1 ?xx2 =  x2 - 1:xx2 = x2 + 1;
			y2 > y1 ? yy2 = y2 - 1:yy2 = y2 + 1;	
	    }
		else  {x2 > x1 ?xx2 =  x2 - 2:xx2 = x2 + 2;yy2=y2;}
	 }*/
	long long md = ha * ha + haha * haha;
	if(cc < a) dfs(x1,y1,xx2,yy2,cc+b,dd,s+1);
	else dfs(x1,y1,xx2,yy2,cc-a,dd - md,s+1);
}
int main()
{
	freopen("do.in","r",stdin);
       freopen("do.out","w",stdout);
	int t;  read(t);
   read(a); read(b);
  for(int i = 1; i <= t; i++)
  {
  	read(x);read(y);read(xx);read(yy);read(c); read(d);
    zong = abs(x-xx) + abs(y - yy);
  	ans = -1;
	  	dfs(x,y,xx,yy,c,d,0);
	  	if(ans == 0) 
	  	{
	  		printf("NAIVE\n");
	  	}
	  	if(ans == 1) 
	  	{
	  		printf("SIMPLE\n"); 
	  	}
  }
  return 0;
}