【EOJ Monthly 2018.10 - A】oxx 的小姐姐们(模拟,水题,填充矩阵,输出格式有坑)
題干:
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 2Output
Yes 2 2 3 1 1 3Input
3 3 2Output
NoInput
3 3 3Output
Yes 2 2 2 1 1 1 3 3 3Input
2 3 2Output
Yes 6 3 3 6 4 4Input
4 2 2Output
Yes 2 7 2 7 5 5 3 3Note
請注意對于最后一組樣例輸出:
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那就填數,但是發現不行,因為就填不成以列了。
總結
以上是生活随笔為你收集整理的【EOJ Monthly 2018.10 - A】oxx 的小姐姐们(模拟,水题,填充矩阵,输出格式有坑)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是影子银行?什么是热钱?
- 下一篇: 什么是大额信用卡 拿下大额信用卡的秘诀在