zoukankan      html  css  js  c++  java
  • Codeforces Round #102 (Div. 1) C Help Caretaker

    题目链接:Help Caretaker

    题意:给一个 n×m 的格子,在这个格子上放置 T 形的锄头,锄头放置方向不同共有 4 种不同的放置方法,问最多能放下多少个锄头,并输出任意一种放置方法。

    题解:暴力搜索所有锄头可以放置的方式,从左向右、从上向下,因此枚举的点总是 4 种方式中最左上的点。但是这回超时,所以需要适行剪枝,如果说剩余的点(还未遍历到的点)总数 / 5 + 当前的 T 个数小于等于目前的最大答案时,直接跳出。但这在数据较大时还是会运行得很慢,需要把除数 5 改成 6,因为在小数据中可以看出不可能会出现所有点均能够被覆盖,并且空余点个数是大于所放锄头数得,这样一来就不会超时了。

    #include <bits/stdc++.h>
    using namespace std;
    
    int n,m;
    int num,ans[10][10],vis[10][10];
    
    void solve(int x,int y,int sum);
    
    bool in(int x,int y){
        return x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y];
    }
    
    void update(int sum){
        if(sum>num){
            num=sum;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    ans[i][j]=vis[i][j];
                }
            }
        }
    }
    
    void dfs(int x,int y,int sum){
        update(sum);
        int res=n*m-(n*(y-1)+x);
        if(res/6+sum<=num) return;
        if(x<1||y<1||x>n||y>m) return;
    
        int next_x=0,next_y=0;
        if(x==n){
            next_x=1,next_y=y+1;
        }
        else{
            next_x=x+1,next_y=y;
        }
        if(in(x,y+1)&&in(x,y+2)&&in(x+1,y+1)&&in(x+2,y+1)&&in(x,y)){
            vis[x][y]=vis[x][y+1]=vis[x][y+2]=vis[x+1][y+1]=vis[x+2][y+1]=sum+1;
            dfs(next_x,next_y,sum+1);
            vis[x][y]=vis[x][y+1]=vis[x][y+2]=vis[x+1][y+1]=vis[x+2][y+1]=0;
        }
        if(in(x,y+1)&&in(x,y+2)&&in(x-1,y+2)&&in(x+1,y+2)&&in(x,y)){
            vis[x][y]=vis[x][y+1]=vis[x][y+2]=vis[x-1][y+2]=vis[x+1][y+2]=sum+1;
            dfs(next_x,next_y,sum+1);
            vis[x][y]=vis[x][y+1]=vis[x][y+2]=vis[x-1][y+2]=vis[x+1][y+2]=0;
        }
        if(in(x,y+1)&&in(x,y+2)&&in(x-1,y+1)&&in(x-2,y+1)&&in(x,y)){
            vis[x][y]=vis[x][y+1]=vis[x][y+2]=vis[x-1][y+1]=vis[x-2][y+1]=sum+1;
            dfs(next_x,next_y,sum+1);
            vis[x][y]=vis[x][y+1]=vis[x][y+2]=vis[x-1][y+1]=vis[x-2][y+1]=0;
        }
        if(in(x+1,y)&&in(x+2,y)&&in(x+1,y+1)&&in(x+1,y+2)&&in(x,y)){
            vis[x][y]=vis[x+1][y]=vis[x+2][y]=vis[x+1][y+1]=vis[x+1][y+2]=sum+1;
            dfs(next_x,next_y,sum+1);
            vis[x][y]=vis[x+1][y]=vis[x+2][y]=vis[x+1][y+1]=vis[x+1][y+2]=0;
        }
        dfs(next_x,next_y,sum);
    }
    
    int main(){
        cin>>n>>m;
    
        dfs(1,1,0);
    
        cout<<num<<endl;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(ans[i][j]) cout<<(char)('A'+ans[i][j]-1);
                else cout<<'.';
            }
            cout<<endl;
        }
    
    
        return 0;
    }
  • 相关阅读:
    php内存管理机制、垃圾回收机制
    Redis 3.2.1集群搭建
    centos开启IPV6配置方法
    /etc/hosts.allow和/etc/hosts.deny详解
    3元购买微信小程序解决方案一个月
    linux下使用ntfs-3g挂载NTFS出错
    腾讯云微信小程序域名变更指南
    nginx开启gzip压缩
    centos 7使用yum安装docker容器
    linux中启动网卡报错:Bringing up interface eth1: Error: Connection activation failed
  • 原文地址:https://www.cnblogs.com/N-Psong/p/10249525.html
Copyright © 2011-2022 走看看