题解:P12549 [UOI 2025] Gift for Anton
GoldExperience641
·
·
题解
思路
这道题说是可以用 3 4,但是这两个数却并不能使用。因为不能只使用这两个数字中的一种拼成一个合法的礼物。
所以尝试构造出一个合法的单位并且可以作为一个小单元的方格。不难找出这种情况。
当行列有不是 3 的倍数时
-
[](https://imgse.com/i/pEx4fJO)
-
[](https://imgse.com/i/pEx4oyd)
## 代码
这道题的代码简直是又臭又长
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int n,m,xn,xm;
int dt[205];
int gz[5][5];
int main(){
cin>>n>>m;
gz[1][1]=gz[1][2]=gz[2][1]=gz[2][2]=2;
gz[1][3]=gz[2][3]=gz[3][1]=gz[3][2]=1;
gz[3][3]=0;
if(n==1&&m==1){
cout<<"0\n";
return 0;
}
if(n<3){
if(n==1){
if(m%3==0){
for(int i=1;i<=m;i++){
cout<<gz[3][(i+3+m%3-1)%3+1]<<" ";
}
}
if(m%3==1){
for(int i=1;i<=m;i++){
cout<<gz[3][(i+3+m%3)%3+1]<<" ";
}
}
if(m%3==2){
for(int i=1;i<=m;i++){
cout<<gz[3][(i+3+m%3)%3+1]<<" ";
}
}
}
if(n==2){
if(m%3==0){
for(int i=1;i<=m;i++){
cout<<gz[1][(i+3+m%3-1)%3+1]<<" ";
}
cout<<"\n";
for(int i=1;i<=m;i++){
cout<<gz[1][(i+3+m%3-1)%3+1]<<" ";
}
}
if(m%3==1){
for(int i=1;i<=m;i++){
cout<<gz[1][(i+3+m%3)%3+1]<<" ";
}
cout<<"\n";
for(int i=1;i<=m;i++){
cout<<gz[1][(i+3+m%3)%3+1]<<" ";
}
}
if(m%3==2){
for(int i=1;i<=m;i++){
cout<<gz[1][(i+3+m%3)%3+1]<<" ";
}
cout<<"\n";
for(int i=1;i<=m;i++){
cout<<gz[1][(i+3+m%3)%3+1]<<" ";
}
}
}
return 0;
}
if(m<3){
if(m==1){
if(n%3==0){
for(int i=1;i<=n;i++){
cout<<gz[3][(i+3+n%3-1)%3+1]<<"\n";
}
}
if(n%3==1){
for(int i=1;i<=n;i++){
cout<<gz[3][(i+3+n%3)%3+1]<<"\n";
}
}
if(n%3==2){
for(int i=1;i<=n;i++){
cout<<gz[3][(i+3+n%3)%3+1]<<"\n";
}
}
}
if(m==2){
if(n%3==0){
for(int i=1;i<=n;i++){
cout<<gz[1][(i+3+n%3+1)%3+1]<<" "<<gz[1][(i+3+n%3+1)%3+1]<<"\n";
}
}
if(n%3==1){
for(int i=1;i<=n;i++){
cout<<gz[1][(i+3+n%3)%3+1]<<" "<<gz[1][(i+3+n%3)%3+1]<<"\n";
}
}
if(n%3==2){
for(int i=1;i<=n;i++){
cout<<gz[1][(i+3+n%3)%3+1]<<" "<<gz[1][(i+3+n%3)%3+1]<<"\n";
}
}
}
return 0;
}
if(n%3==0){
if(m%3==0){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
}
cout<<"\n";
}
}
if(m%3==1){
for(int i=1;i<=n;i++){
for(int j=1;j<=m-1;j++){
if(j==1) cout<<gz[3][(i-1)%3+1]<<" ";
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
}
cout<<"\n";
}
}
if(m%3==2){
for(int i=1;i<=n;i++){
for(int j=1;j<=m-2;j++){
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
if(j==m-2) cout<<gz[1][(i-1)%3+1]<<" "<<gz[1][(i-1)%3+1];
}
cout<<"\n";
}
}
}
if(n%3==1){
if(m%3==0){
for(int i=1;i<=m;i++){
cout<<gz[3][(i-1)%3+1]<<" ";
}cout<<"\n";
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m;j++){
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
}
cout<<"\n";
}
}
if(m%3==1){
for(int i=1;i<=m-1;i++){
if(i==1) cout<<gz[3][(i+1)%3+1]<<" ";
cout<<gz[3][(i-1)%3+1]<<" ";
}cout<<"\n";
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m-1;j++){
if(j==1) cout<<gz[3][(i-1)%3+1]<<" ";
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
}
cout<<"\n";
}
}
if(m%3==2){
for(int i=1;i<=m-2;i++){
cout<<gz[3][(i-1)%3+1]<<" ";
if(i==m-2) cout<<gz[1][(i-1)%3+1]<<" "<<gz[1][(i-1)%3+1];
}cout<<"\n";
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m-2;j++){
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
if(j==m-2) cout<<gz[1][(i-1)%3+1]<<" "<<gz[1][(i-1)%3+1];
}
cout<<"\n";
}
}
}
if(n%3==2){
if(m%3==0){
for(int i=1;i<=n-2;i++){
for(int j=1;j<=m;j++){
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
}
cout<<"\n";
}
for(int i=1;i<=m;i++){
cout<<gz[1][(i-1)%3+1]<<" ";
}cout<<"\n";
for(int i=1;i<=m;i++){
cout<<gz[2][(i-1)%3+1]<<" ";
}cout<<"\n";
}
if(m%3==1){
for(int i=1;i<=n-2;i++){
for(int j=1;j<=m-1;j++){
if(j==1) cout<<gz[3][(i-1)%3+1]<<" ";
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
}
cout<<"\n";
}
for(int i=1;i<=m-1;i++){
if(i==1) cout<<gz[3][(i-1)%3+1]<<" ";
cout<<gz[1][(i-1)%3+1]<<" ";
}cout<<"\n";
for(int i=1;i<=m-1;i++){
if(i==1) cout<<gz[3][(i-1)%3+1]<<" ";
cout<<gz[2][(i-1)%3+1]<<" ";
}cout<<"\n";
}
if(m%3==2){
for(int i=1;i<=n-2;i++){
for(int j=1;j<=m-2;j++){
cout<<gz[(i-1)%3+1][(j-1)%3+1]<<" ";
if(j==m-2) cout<<gz[1][(i-1)%3+1]<<" "<<gz[1][(i-1)%3+1];
}
cout<<"\n";
}
for(int i=1;i<=m-2;i++){
cout<<gz[1][(i-1)%3+1]<<" ";
if(i==m-2) cout<<gz[1][(i+1)%3+1]<<" "<<gz[1][(i+1)%3+1];
}cout<<"\n";
for(int i=1;i<=m-2;i++){
cout<<gz[2][(i-1)%3+1]<<" ";
if(i==m-2) cout<<gz[1][(i+1)%3+1]<<" "<<gz[1][(i+1)%3+1];
}cout<<"\n";
}
}
}
```