每天一题:洛谷P2041分裂游戏

题目描述

有一个无限大的棋盘,棋盘左下角有一个大小为 n 的阶梯形区域,其中最左下角的那个格子里有一枚棋子。你每次可以把一枚棋子“分裂”成两枚棋子,分别放在原位置的上边一格和右边一格。(但如果目标位置已有棋子,则不能这样做)你的目的是通过有限次的操作,让整个阶梯里不再有任何棋子。下图所示的是 n=2 时的一种解法。

图片来源于洛谷

我们用从下往上数的方式标记行,从左往右数的方式标记列,以 (行,列) 来标记棋子,并且都从 1 开始。

例如,第三步中的三个棋子坐标分别为 (3,1),(2,2),(1,2)。

现在已知 n,你需要做的是给出合适的操作序列。

输入格式

输入一个正整数 n。

输出格式

如果有解,第一行应包含一个正整数 m,表示总共需要的操作步数。

以下 m 行,每行包括两个正整数 xi,yi,表示第 iii 步操作分裂的是处于第 xi​ 行第 yi 列的棋子。

如果无解,只需在第一行输出 −1。

输入输出样例

输入 #1

1

输出 #1

1
1 1

输入 #2

2

输出 #2

4
1 1
2 1
2 2
1 2

说明/提示

  • 对于 40% 的数据:n≤8;
  • 对于 100% 的数据:n≤1000。

解题方法

我刚开始看见标签时就猜到这是一道找规律题(标签为数学)(长这样的题除了找规律以外没别的可能),所以就直接手动模拟了第n为3时的情况,结果发现怎么都分不出来,总有一些棋子挡住了分裂,各个棋子互相牵制,怎么也分不下去了(QWQ手动尝试了半天),既然n为3都分不下去,那n更大自然也分不下去辣。

代码

是人都打的出这段代码八~

还是提供代码比就好hhh

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin>>n;
	if(n==1){
		cout<<1<<endl<<1<<" "<<1;
	}
	else if(n==2){
		cout<<4<<endl<<1<<" "<<1<<endl<<2<<" "<<1<<endl<<2<<" "<<2<<endl<<1<<" "<<2;
	}
	else{
		cout<<"-1";
	}
	return 0;
}

哎嗨结束咯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值