2019 CCPC Final L题

因为找不到原题链接,挂个差不多的

第七届“图灵杯“NEUQ-ACM程序设计竞赛(个人赛)A题:溜圈圈

题目描述

BigSheep总是喜欢溜圈,但是他有几个原则:

只能向左转,且不能在同一个地方多次左转。
每次只走不同的圈。
每次走圈走遍整个区域,同一个点只去一次,起点不一定需要等于终点。
有一天,BigSheep半夜睡不着觉,跑去操场溜圈。我们可以认为操场是一个n×m的网格图,神奇的BigSheep可以把任意一个格子当作自己的起点开始绕圈,对于BigSheep那些奇怪的原则,我们可以抽象成以下几点:

BigSheep在起点时可以任意选择自己的朝向。
每次只能直走,或者左转后直走,且不能越过边界。
每次走圈的路径不能一样,即同一个路径不能走多次(对于两条路径,存在一个格子(x0,y0)在第一条路径中是第i个访问的,在第二条路径中是第j个访问的,且i != j,我们即可认为这两条路径是不同的)。每次溜圈都需要遍历每一个格子,且每一个格子只能被访问一次,溜圈的起点和终点不需要保证相邻。

BigSheep想知道自己最多可以溜多少圈。

样例输入

1
2 2

样例输出

4

思路:
模拟m = n = 3,可能便于理解。把这整个大块分成两个小块,看有多少种分法,即找分界线,每一条分界线对应唯一条路径。唯一的原因是,从标记的那个点,分别向两小块延展只有唯一情况。m,n取其他值也一样,映射到最外圈其实就是周长。
2019 CCPC Final L题_第1张图片

参考代码

//A.溜圈圈:点一,线二,面周长
#include
using namespace std;
int main() 
{
     
	int t;
	cin >> t;
	while (t --) 
	{
     
		int m, n;
		cin >> m >> n;
		if (m >= n) swap(m, n);

		if (m == 1 && n == 1) cout << 1;
		else if (m == 1 && n > 1) cout << 2;
		else if (m > 1 && n > 1) cout << 2 * (m + n - 2);

		cout << endl;
	}
	return 0;
}

你可能感兴趣的:(笔记,算法)