CF彩笔题解1647 A to C

A

分析

通过模拟一些例子我们可以发现其实就是对%3做讨论:
如果n % 3 == 0, 则输出(n / 3)个 “21” (比“12”更大)
如果n % 3 == 1, 则输出(n / 3)个 “12” (拆解出的位数更多) + 末尾的一个"1"
如果n % 3 == 2, 则输出(n / 3)个 “21” (比“12”更大) + 末尾的一个"2"

AC代码

#include<iostream>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        if(n<3)
          {
              cout<<n<<endl;
              continue;
          }
        int q=n/3,w=n%3;
        if(w==0)
          for(int i=0;i<q;i++)
               cout<<"21";
          else if(w==1)
          {
              cout<<'1';
              for(int i=0;i<q;i++)
                 cout<<"21";
          }
          else 
          {
              for(int i=0;i<q;i++)
              cout<<"21";
             cout<<'2';
          }
        puts("");
    }
    
return 0;}

 

B

分析

只要存在01

               11

就是NO

AC代码

#include<iostream>
using namespace std;
int a[110][110];
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=0;i<n;i++)
          for(int j=0;j<m;j++)
          scanf("%1d",&a[i][j]);
          int t=1;
        for(int i=0;i<n-1;i++)
        {
            if(t==0)   break;
          for(int j=0;j<m-1;j++)
          {
              if(a[i][j]==0&&a[i][j+1]==1&&a[i+1][j]==1&&a[i+1][j+1]==1)
                    { t=0; break;} 
            else if(a[i][j]==1&&a[i][j+1]==0&&a[i+1][j]==1&&a[i+1][j+1]==1)
                    { t=0; break;} 
            else if(a[i][j]==1&&a[i][j+1]==1&&a[i+1][j]==0&&a[i+1][j+1]==1)
                    { t=0; break;} 
              else if(a[i][j]==1&&a[i][j+1]==1&&a[i+1][j]==1&&a[i+1][j+1]==0)
                    { t=0; break;} 
              
          }
          }
          if(t) puts("YES");
        else puts("NO");
    }
    
return 0;
}

 

C

分析

可以发现,矩阵左上角的位置(1,1)是无法被染成黑色(1方格)的,如果目标矩阵的左上角为黑色则无解。从最后一层最后一个开始涂起,如果当前位置应要黑色,就把位置涂黑,然后把上面的位置涂白,一直这样到第一层再从右边往左涂,涂到第一个就无法动了,所以只要第一个不是1,那么就有方案

AC代码

#include<iostream>
#include<vector> 
using namespace std;
const int N=110;
char x[N][N];
int n,m;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        vector<pair<int ,int>> ans;
        for(int i=1;i<=n;i++)
        {
             for(int j=1;j<=m;j++)
               cin>>x[i][j];
        }
        int f=0;
        for(int i=n;i>=1;i--)
        {
            for(int j=m;j>=1;j--)
            {
                if(x[i][j]=='1')
                {
                    if(i-1>=1)
                    {
                        ans.push_back({i-1,j});
                        ans.push_back({i,j});
                    }
                    else if(j-1>=1)
                    {
                        ans.push_back({i,j-1});
                        ans.push_back({i,j});
                    }
                    else f=1;
                }
                
            }
        }        
        if(f==1)  cout<<-1<<endl;
        else
        {
            cout<<ans.size()/2<<endl;
            for(int i=0;i<ans.size();i+=2)
              cout<<ans[i].first<<" "<<ans[i].second<<" "<<ans[i+1].first<<" "<<ans[i+1].second<<endl;
        } 
            
    }
    
    
return 0; }

 

 

posted @ 2022-03-17 17:35  szf45  阅读(46)  评论(0)    收藏  举报