hdu4740【杭州网赛、模拟、有点搜索?】
当时看了这题就感觉so easy。。。 本来不想写的,后来感觉是不是可以练一下搜索水平。。
比赛时有人过了就没写。 比赛完了写一下。
实现还不是那么顺利, 囧
本来自己以为这题能练下搜索,其实DFS、BFS都没用到,也许模拟中有点搜索吧。
还是类似方格的东西把外围也设置成未标记要好的多,做题多了也许就有这种感觉了吧。
还有自己忽略了驴 老虎前面是已经走过的路也可以转弯。 BS!!
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;const int MAX_N = 1000 + 10;int n;//E,S,W,Nint dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };struct Walker { int x, y, d, turn; bool active; bool vis[MAX_N][MAX_N]; //where had he visited void read(int turn) { this->turn = turn; cin >> x >> y >> d; active = true; memset(vis, 0, sizeof vis); } bool check(int r, int c) { return r >= 0 && r < n && c >= 0 && c < n && !vis[r][c]; } void walk() { //can walk? //go stright if (check(x + dx[d], y + dy[d])) { x += dx[d], y += dy[d]; goto end; } d = (d + turn) % 4; if (check(x + dx[d], y + dy[d])) { x += dx[d], y += dy[d]; goto end; } active = false; //dead >_< return; end: { } vis[x][y] = true; }};Walker A, B;int main() { for (;;) { cin >> n; if (n == 0) break; A.read(1); B.read(3); A.vis[A.x][A.y] = true; B.vis[B.x][B.y] = true; for (;;) { if (!A.active && !B.active) break; //end! if (A.x == B.x && A.y == B.y) { cout << A.x << " " << A.y << endl; goto end; } if (A.active) { A.walk(); } if (B.active) { B.walk(); } } cout << -1 << endl; end: { } }}