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;
}

 

posted on 2019-01-10 13:40  Psong  阅读(263)  评论(0编辑  收藏  举报

导航