CF45J 题解

题目传送门。

题意:题目已经概括的很清楚了。

思路:

通过枚举,我们可以发现有 55 种情况一定无解:

情况 \ mmnn mm nn
11 11 22
22 11 33
33 22 11
44 22 22
55 33 11

不难发现,在这些情况下的 m+n<5m+n<5

if(m+n<5)cout<<-1;

对于 n=1n=1m=1m=1 的情况,输出 11

if(m==1&&n==1){
	cout<<1;
	return 0;
}

对于其他情况,可以分段编数:

对于 0im0\leq i\leq m0jn0\leq j\leq n

  • i+jmod2=0i+j\mod 2=0,将其顺序在 [0,m×n2][0,\frac{m\times n}{2}] 区间内编数。

  • i+jmod2=1i+j\mod 2=1,将其顺序在 [m×n2+1,m×n][\frac{m\times n}{2}+1,m\times n] 区间内编数。

例:n=6,m=5n=6,m=5

nn \ mm 1\color{red}1 2\color{red}2 3\color{red}3 4\color{red}4 5\color{red}5
1\color{blue}1 1\color{green}1 16\color{brown}16 2\color{green}2 17\color{brown}17 3\color{green}3
2\color{blue}2 18\color{brown}18 4\color{green}4 19\color{brown}19 5\color{green}5 20\color{brown}20
3\color{blue}3 6\color{green}6 21\color{brown}21 7\color{green}7 22\color{brown}22 8\color{green}8
4\color{blue}4 23\color{brown}23 9\color{green}9 24\color{brown}24 10\color{green}10 25\color{brown}25
5\color{blue}5 11\color{green}11 26\color{brown}26 12\color{green}12 27\color{brown}27 13\color{green}13
6\color{blue}6 28\color{brown}28 14\color{green}14 29\color{brown}29 15\color{green}15 30\color{brown}30

其中,绿色\color{green}\text{绿色} 部分为 [0,m×n2][0,\frac{m\times n}{2}] 区间,棕色\color{brown}\text{棕色} 部分为 [m×n2+1,m×n][\frac{m\times n}{2}+1,m\times n] 区间。

根据实验,此方法可行。

#include<bits/stdc++.h>
using namespace std;
int a[101][101];
int main(){
	int m,n;
	cin>>m>>n;
	if(m==1&&n==1){
		cout<<1;
		return 0;
	}
	if(m+n<5)cout<<-1;
	else{
		int t=1,q=(m*n)/2+1,cnt=0;
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				cnt++;
				if((i+j)%2)cout<<t++;
				else cout<<q++;
				cout<<' ';
			}
			
		}
	}
	return 0;
}
posted @   Weslie_qwq  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示