P15417 「yrOI R1」彼时蓝星题解

P15417 「yrOI R1」彼时蓝星

题目背景

题目描述

给你一个 n×mn \times mn×m 的网格,你需要在网格上放置若干个国际象棋中的王,使得每个王的攻击范围内有且仅有 111 个王。

你需要构造使得你放置王的数量最多,如果有多种方案,给出任意一种方案即可。

注:国际象棋中的王的攻击范围为距离它切比雪夫距离为 111 的格子。

输入格式

第一行一个数 TTT,代表数据组数。

接下来 TTT 行每行两个数 n,mn,mn,m,代表一次查询。

输出格式

对于每组数据,第一行一个数代表最多放置的王的个数。

接下来输出一个 nnnmmm 列的 01 串 aaa,如果 ai,j=1a_{i,j}=1ai,j=1,则表示在 (i,j)(i,j)(i,j) 放置了一个王。

如果你的答案的第一个数正确,你将会得到该测试点 20%20\%20% 的分数。注意:请一定在后面输出一个方案(尽管可能是不合法的)。

输入输出样例 #1

输入 #1

3
2 2
3 4
3 3

输出 #1

2
10
10
6
1101
0001
1100
4
110
000
110

说明/提示

【数据范围】

本题开启捆绑测试

  • Subtask 1(5 pts):1≤n,m≤41 \le n,m \le 41n,m4
  • Subtask 2(5 pts):1≤n,m≤101 \le n,m \le 101n,m10
  • Subtask 3(5 pts):n=1n=1n=1
  • Subtask 4(5 pts):n=2n=2n=2
  • Subtask 5(5 pts):无特殊限制。

对于所有数据,1≤T≤1051 \le T \le 10^51T1051≤n,m,∑nm≤1061 \le n,m,\sum nm \le 10^61n,m,nm106

思路

直接写即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long t,n,m,op=0,op2=0;
vector<vector<long long>> f,g;
int main(){
    cin>>t;
    while(t--){
        cin>>n>>m;
        f.resize(n+1);
        for(int i=1;i<=n;i++){
            f[i].resize(m+1);
        }
        swap(n,m);
        g.resize(n+1);
        for(int i=1;i<=n;i++){
            g[i].resize(m+1);
        }
        swap(n,m);
        op2=0;
        if(n==1){
            cout<<(n*m+1)/3*2<<endl;
            if(m==1){
                cout<<0<<endl;
                continue;
            }
            for(int i=1;i<=m;i++){
                if(i%3!=0&&(i!=m||(i-1)%3!=0)){
                    cout<<1<<"";
                }
                else{
                    cout<<0<<"";
                }
            }
            cout<<endl;
            for(int i=1;i<=n;i++){
                f[i].clear();
            }
            f.clear();
            continue;
        }
        if(n==2){
            cout<<(m+1)/2*2<<endl;
            for(int i=1;i<=m;i++){
                if(i%2==1){
                    cout<<1<<"";
                }
                else{
                    cout<<0<<"";
                }
            }
            cout<<endl;
            for(int i=1;i<=m;i++){
                if(i%2==1){
                    cout<<1<<"";
                }
                else{
                    cout<<0<<"";
                }
            }            
            cout<<endl;
            for(int i=1;i<=n;i++){
                f[i].clear();
            }
            f.clear();
            continue;
        }
        if(m==1){
            cout<<(n*m+1)/3*2<<endl;
            if(n==1){
                cout<<0<<endl;
                continue;
            }
            for(int i=1;i<=n;i++){
                if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                    cout<<1<<endl;
                }
                else{
                    cout<<0<<endl;
                }
            }
            for(int i=1;i<=n;i++){
                f[i].clear();
            }
            f.clear();
            continue;
        }
        if(m==2){
            cout<<(n+1)/2*2<<endl;
            for(int i=1;i<=n;i++){
                if(i%2==1){
                    cout<<1<<"1"<<endl;
                }
                else{
                    cout<<0<<"0"<<endl;
                }
            }
            for(int i=1;i<=n;i++){
                f[i].clear();
            }
            f.clear();
            continue;
        }        
        op=0;
        op=0;
        if(n%2==1){
            if(m%3==2){
                op=0;
                for(int i=1;i<=n;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0){
                            op++;
                            f[i][j]=1;
                        }
                        else{
                            f[i][j]=0;
                        }
                    }
                }
            }
            else if(m%3==1){
                op=0;
                for(int i=1;i<=n;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0&&j!=m){
                            op++;
                            f[i][j]=1;
                        }
                        else{
                            f[i][j]=0;
                        }
                    }
                }
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op++;
                        f[i][m]=1;
                    }
                    else{
                        f[i][m]=0;
                    }
                }  
            }
            else{
                op=0;
                for(int i=1;i<=n;i++){
                    for(int j=1;j<=m-4;j++){
                        if(i%2==1&&j%3!=0){
                            op++;
                            f[i][j]=1;
                        }
                        else{
                            f[i][j]=0;
                        }
                    }
                }           
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op+=2;
                        f[i][m]=f[i][m-2]=1;
                    }
                    else{
                        f[i][m]=f[i][m-2]=0;
                    }                    
                }
            }
        }   
        else{
           if(m%3==2){
                op=0;
                for(int i=1;i<=n-3;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0){
                            op++;
                            f[i][j]=1;
                        }
                        else{
                            f[i][j]=0;
                        }
                    }
                }
                for(int i=1;i<=m;i++){
                    if(i%2==1){
                        op+=2;
                        f[n-1][i]=1;
                        f[n][i]=1;
                    }
                    else{
                        f[n-1][i]=0;
                        f[n][i]=0;                        
                    }
                }
            }
            else if(m%3==1){
                op=0;
                for(int i=1;i<=n-3;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0&&j!=m){
                            op++;
                            f[i][j]=1;
                        }
                        else{
                            f[i][j]=0;
                        }
                    }
                }
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op++;
                        f[i][m]=1;
                    }
                    else{
                        f[i][m]=0;
                    }
                }
                for(int i=1;i<=m-2;i++){
                    if(i%2==1){
                        op+=2;
                        f[n-1][i]=1;
                        f[n][i]=1;
                    }
                    else{
                        f[n-1][i]=0;
                        f[n][i]=0;                        
                    }
                }                
            }
            else{
                op=0;
                for(int i=1;i<=n-3;i++){
                    for(int j=1;j<=m-4;j++){
                        if(i%2==1&&j%3!=0){
                            op++;
                            f[i][j]=1;
                        }
                        else{
                            f[i][j]=0;
                        }
                    }
                }           
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op+=2;
                        f[i][m]=f[i][m-2]=1;
                    }
                    else{
                        f[i][m]=f[i][m-2]=0;
                    }                    
                }  
                //f[n-2][m-2]=f[n-2][m]=f[n-1][m-2]=f[n-1][m]=0;
                if(n%3==0){
                    f[n-2][m-2]=f[n-2][m]=f[n-1][m-2]=f[n-1][m]=0;
                    
                    f[n-2][m-1]=f[n-2][m]=f[n][m-1]=f[n][m]=1;
                    for(int i=1;i<=m-3;i++){
                        if(i%2==1){
                            op+=2;
                            f[n-1][i]=1;
                            f[n][i]=1;
                        }
                        else{
                            f[n-1][i]=0;
                            f[n][i]=0;                        
                        }
                    }                       
                }
                else{
                    for(int i=1;i<=m-4;i++){
                        if(i%2==1){
                            op+=2;
                            f[n-1][i]=1;
                            f[n][i]=1;
                        }
                        else{
                            f[n-1][i]=0;
                            f[n][i]=0;                        
                        }
                    }                       
                }
            }            
        }     
        if(f[n][m]==0&&f[n][m-1]==0&&f[n-1][m-1]==0&&f[n-1][m]==0&&f[n][m-2]==0&&f[n-1][m-2]==0){
            f[n][m]=f[n][m-1]=1;
            op+=2;
        }
        if(f[n][m]==0&&f[n-1][m]==0&&f[n-1][m-1]==0&&f[n][m-1]==0&&f[n-2][m]==0&&f[n-2][m-1]==0){
            f[n][m]=f[n-1][m]=1;
            op+=2;
        }        
        swap(n,m);
        if(n%2==1){
            if(m%3==2){
                op2=0;
                for(int i=1;i<=n;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0){
                            op2++;
                            g[i][j]=1;
                        }
                        else{
                            g[i][j]=0;
                        }
                    }
                }
            }
            else if(m%3==1){
                op2=0;
                for(int i=1;i<=n;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0&&j!=m){
                            op2++;
                            g[i][j]=1;
                        }
                        else{
                            g[i][j]=0;
                        }
                    }
                }
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op2++;
                        g[i][m]=1;
                    }
                    else{
                        g[i][m]=0;
                    }
                }  
            }
            else{
                op2=0;
                for(int i=1;i<=n;i++){
                    for(int j=1;j<=m-4;j++){
                        if(i%2==1&&j%3!=0){
                            op2++;
                            g[i][j]=1;
                        }
                        else{
                            g[i][j]=0;
                        }
                    }
                }           
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op2+=2;
                        g[i][m]=g[i][m-2]=1;
                    }
                    else{
                        g[i][m]=g[i][m-2]=0;
                    }                    
                }
            }
        }   
        else{
           if(m%3==2){
                op2=0;
                for(int i=1;i<=n-3;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0){
                            op2++;
                            g[i][j]=1;
                        }
                        else{
                            g[i][j]=0;
                        }
                    }
                }
                for(int i=1;i<=m;i++){
                    if(i%2==1){
                        op2+=2;
                        g[n-1][i]=1;
                        g[n][i]=1;
                    }
                    else{
                        g[n-1][i]=0;
                        g[n][i]=0;                        
                    }
                }
            }
            else if(m%3==1){
                op2=0;
                for(int i=1;i<=n-3;i++){
                    for(int j=1;j<=m;j++){
                        if(i%2==1&&j%3!=0&&j!=m){
                            op2++;
                            g[i][j]=1;
                        }
                        else{
                            g[i][j]=0;
                        }
                    }
                }
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op2++;
                        g[i][m]=1;
                    }
                    else{
                        g[i][m]=0;
                    }
                }
                for(int i=1;i<=m-2;i++){
                    if(i%2==1){
                        op2+=2;
                        g[n-1][i]=1;
                        g[n][i]=1;
                    }
                    else{
                        g[n-1][i]=0;
                        g[n][i]=0;                        
                    }
                }                
            }
            else{
                op2=0;
                for(int i=1;i<=n-3;i++){
                    for(int j=1;j<=m-4;j++){
                        if(i%2==1&&j%3!=0){
                            op2++;
                            g[i][j]=1;
                        }
                        else{
                            g[i][j]=0;
                        }
                    }
                }           
                for(int i=1;i<=n;i++){
                    if(i%3!=0&&(i!=n||(i-1)%3!=0)){
                        op2+=2;
                        g[i][m]=g[i][m-2]=1;
                    }
                    else{
                        g[i][m]=g[i][m-2]=0;
                    }                    
                }  
                for(int i=1;i<=m-4;i++){
                    if(i%2==1){
                        op2+=2;
                        g[n-1][i]=1;
                        g[n][i]=1;
                    }
                    else{
                        g[n-1][i]=0;
                        g[n][i]=0;                        
                    }
                }   
            }            
        }     
        if(g[n][m]==0&&g[n][m-1]==0&&g[n-1][m-1]==0&&g[n-1][m]==0&&g[n][m-2]==0&&g[n-1][m-2]==0){
            g[n][m]=g[n][m-1]=1;
            op2+=2;
        }
        if(g[n][m]==0&&g[n-1][m]==0&&g[n-1][m-1]==0&&g[n][m-1]==0&&g[n-2][m]==0&&g[n-2][m-1]==0){
            g[n][m]=g[n-1][m]=1;
            op2+=2;
        }      
        swap(n,m);
        if(op>=op2){
            cout<<op<<endl;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    cout<<f[i][j]<<"";
                }
                cout<<endl;
            }            
        }
        else{
            cout<<op2<<endl;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    cout<<g[j][i]<<"";
                }
                cout<<endl;
            }            
        }
        // cout<<op<<endl;
        // for(int i=1;i<=n;i++){
        //     for(int j=1;j<=m;j++){
        //         cout<<f[i][j]<<"";
        //     }
        //     cout<<endl;
        // }
        for(int i=1;i<=n;i++){
            f[i].clear();
        }
        f.clear();
        swap(n,m);
        for(int i=1;i<=n;i++){
            g[i].clear();
        }
        g.clear();
        swap(n,m);   
    }
	return 0;
} 
posted @ 2026-03-02 16:51  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源