#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
//输入保证初始点到原点距离小于d,判断的是移动点到原点的距离(不是初始点)
//将所有向量先排序(从大到小),然后依次取出,若所有选择都失败,则跳出
//如果当时是A赢,那么A赢,如果是B赢,那么进入A的下一个选择,A有N次机会
using namespace std;
struct Point
{
int x, y;
Point();
Point(int x1, int y1): x(x1), y(y1) {}
};
vector<Point> dir;
int xo, yo, n, d;
bool lessmark(const Point & stItem1, const Point & stItem2)
{
return pow(abs(stItem1.x - xo), 2) + pow(abs(stItem1.y - yo), 2) < pow(abs(stItem2.x - xo), 2) + pow(abs(stItem2.y - yo), 2);
}
bool greatermark(const Point & stItem1, const Point & stItem2)
{
return pow(abs(stItem1.x), 2) + pow(abs(stItem1.y), 2) > pow(abs(stItem2.x), 2) + pow(abs(stItem2.y), 2);
}
bool dis(int x, int y)
{
if(pow(x, 2) + pow(y, 2) <= d * d)
{
return true;
}
return false;
}
int main()
{
cin >> xo >> yo >> n >> d;
Point m(0, 0);
for(int i = 0; i < n; i++)
{
cin >> m.x >> m.y;
dir.push_back(m);
}
// sort(dir.begin(),dir.end(),lessmark);
sort(dir.begin(), dir.end(), greatermark); //big->small
int no = 1;
int rec = 0;
if(!dis(dir[n-1].x + xo, dir[n-1].y + yo))
{
cout << "Dasha" << endl;
return 0;
}
for(int k = 0; k < n; k++)
{
Point cur(xo+dir[k].x, yo+dir[k].y);
no = 1;
rec = 0;
for(int i = 0; ;)
{
if(i == dir.size())
{
i = 0;
}
if(dis(cur.x + dir[i].x , cur.y + dir[i].y))
{
no++;
rec = 0;
cur.x += dir[i].x;
cur.y += dir[i].y;
i = 0;
}
else
{
i++;
rec++;
if(rec == n)
{
break;
}
}
}
if(no%2!=0){
cout<<"Anton"<<endl;
return 0;
}
}
cout << "Dasha" << endl;
return 0;
}
想通后可以用DFS做,这样比较不水