做(一道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;
}