SGU 150.Mr. Beetle II

非常烦人的题,思路比较简单,十分容易出错,细节非常重要。

从四个不同的行走方向讨论经过的每一个格子。

code:

 

#include <iostream>

#include <utility>

#include <cmath>

using namespace std;

#define lb long double

#define fi first

#define se second

pair<int , int > a, b;

int n, tot;

const lb eps = 1e-10;

int floor2 (lb x)

{

	if (ceil (x) - x < eps) return ceil (x);

	return floor (x);

}

int ceil2 (lb x)

{

	if (x - floor (x) < eps) return floor (x);

	return ceil (x);

}

int main() {

	cin >> a.fi >> a.se >> b.fi >> b.se >> n;

	if (a.fi == b.fi || a.se == b.se) cout << "no solution";

	else {

		lb x = a.fi, y = a.se, lx = a.fi, ly = a.se;

		lb k = ( (lb) b.se - (lb) a.se) / ( (lb) b.fi - (lb) a.fi);

		//↗方向

		if (a.fi < b.fi && a.se < b.se) {

			while (fabs (x - b.fi) > eps && fabs (y - b.se) > eps) {

				lb dtx = min ( (floor2 (y) + 1 - y) / k, floor2 (x) + 1 - x);

				x += dtx, y += dtx * k;

				tot++;

				if (tot == n) break;

				lx = x, ly = y;

			}

		}

		//↙方向

		else if (a.fi > b.fi && a.se > b.se) {

			while (fabs (x - b.fi) > eps && fabs (y - b.se) > eps) {

				lb dtx = min ( (y - ceil2 (y) + 1 ) / k, x - ceil2 (x) + 1 );

				x -= dtx, y -= dtx * k;

				tot++;

				if (tot == n) break;

				lx = x, ly = y;

			}

		}

		//↘方向

		else if (a.fi < b.fi && a.se > b.se) {

			while (fabs (x - b.fi) > eps && fabs (y - b.se) > eps) {

				lb dtx = min ( (ceil2 (y) - 1 - y) / k, floor2 (x) + 1 - x);

				x += dtx, y += dtx * k;

				tot++;

				if (tot == n) break;

				lx = x, ly = y;

			}

		}

		//↖方向

		else if (a.fi > b.fi && a.se < b.se) {

			while (fabs (x - b.fi) > eps && fabs (y - b.se) > eps) {

				lb dtx = min ( (y - floor2 (y) - 1 ) / k, x - ceil2 (x) + 1);

				x -= dtx, y -= dtx * k;

				tot++;

				if (tot == n) break;

				lx = x, ly = y;

			}

		}

		if (tot < n) cout << "no solution";

		else

			cout << floor2 ( (lx + x) / 2) << ' ' << floor2 ( (ly + y) / 2);

	}

	return 0;

}

  

你可能感兴趣的:(etl)