【EOJ Monthly 2018.10 - A】oxx 的小姐姐们(模拟,水题,填充矩阵,输出格式有坑)

81 篇文章 1 订阅
9 篇文章 0 订阅

题干:

Time limit per test: 1.0 seconds

Memory limit: 512 megabytes

oxx 和他的小姐姐(们)躺在图书馆前的大草坪上看星星。

有强迫症的 oxx 想要使得他的小姐姐们正好躺成一块 n×m 的长方形。

已知小姐姐的形状是 1×p 的长方形(可以横着或竖着躺)。小姐姐从 1 到 nm 编号总共有 nm 个(如果可以的话,绝对够用)。

P.S. 小姐姐是 1×p 的是因为她们比较苗条。

Input

输入三个整数 n , m , p (1≤n,m,p≤100 ,p 是质数)。

Output

如果不行,输出 No

否则输出 Yes。随后输出 n 行 m 列正整数用空格隔开。同一个小姐姐用相同的数字表示,不同的小姐姐用不同的数字表示。数字应是在 [1,nm] 范围内的正整数。同一个数字至多出现 p 次,这 p 次应该在横向连续,或者纵向连续。

如果有多解输出任意一解。

Examples

Input

2 3 2

Output

Yes
2 2 3
1 1 3

Input

3 3 2

Output

No

Input

3 3 3

Output

Yes
2 2 2
1 1 1
3 3 3

Input

2 3 2

Output

Yes
6 3 3
6 4 4

Input

4 2 2

Output

Yes
2 7
2 7
5 5
3 3

Note

请注意对于最后一组样例输出:

2 1
2 1
1 2
1 2

是不合法的。因为不同的小姐姐必须用不同的数字表示。你居然把 1 号小姐姐和 2 号小姐姐克隆了 QAQ。

 

解题报告:

   题目不算难那,直接模拟就好了。先由样例可以试出来No的条件。然后剩下Yes的构造一个解就可以了。首先为了统一,令列数大于行数(swap一下),即保证这是一个躺着的矩形,然后按行遍历,填数字,然后对于剩下还没有填的,按每一列进行遍历填数字就可以了。最后输出的时候看最初是否行列交换过,来判断输出格式。

AC代码:

#include<bits/stdc++.h>

using namespace std;
int n,m,p; 
int maze[105][105];
bool bk[105][105];
int main()
{
	cin>>n>>m>>p;
	if(n%p==0 || m%p==0) puts("Yes");
	else {
		puts("No");return 0;
	}
	int cur = 1,cnt = 0;
	bool flag = 0;
	if(n > m) flag=1,swap(n,m);
	 
	for(int i = 1; i<=n; i++) {
		for(int j = 1; j<=m-(m%p); j++) {
			maze[i][j] = cur;
			bk[i][j]=1;
			cnt++;
			if(cnt % p == 0) cur++;
		}
	}
	int st = m-(m%p)+1;
	for(int i = st; i<=m; i++) {
		for(int j = 1; j<=n; j++) {
			if(bk[j][i] == 0) {
				maze[j][i] = cur;
				bk[j][i]=1;
				cnt++;
				if(cnt%p==0) cur++;
			}
		}
	}
	if(flag) {
		for(int i = 1; i<=m; i++) {
			for(int j = 1; j<=n; j++) {
				printf("%d%c",maze[j][i],j==n?'\n' : ' ');
			}
		}
	}
	else {
		for(int i = 1; i<=n; i++) {
			for(int j = 1; j<=m; j++) {
				printf("%d%c",maze[i][j],j==m?'\n' : ' ');
			}
		}
	}
	return 0 ;
}

总结:

   1.有的时候多开一个bk数组会省好多事。   

   2.刚开始对于剩下的想直接遍历整个矩阵:如果bk==0那就填数,但是发现不行,因为就填不成以列了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值