CF691 Div2 1459B - Move and Turn
题目大意:
起初你在一个二维平面的原点,第一次你可以选择东西南北任意方向出发,之后每走一步,你必须九十度向左或者右转,问经过n步之后,有多少个不同的终点。
思路:
先考虑,假设n为偶数,那么要走n/2步水平方向,和n/2步竖直方向,并且水平和竖直互不干扰,可以知道走n/2步水平方向,可以走出(n/2+1)种不同的纵坐标,因为:

所以公有(n/2+1)²种不同的点
再考虑n(2*k+1)为奇数时,有k+1种水平走法,k种竖直走法,或者k种水平走法,k+1种竖直走法,不管哪一种,都有(k+2)*(k+1)个不同的点,道理同上,所以共有2*(k+2)*(k+1)个不同的点,时间复杂度O(1)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() { 4 int n; 5 cin >> n; 6 if(n % 2 == 0) { 7 cout << (n/2+1)*(n/2+1) << endl; 8 } else { 9 cout << 2*((n+1)/2)*((n+1)/2+1) << endl; 10 } 11 return 0; 12 }

浙公网安备 33010602011771号