题目传送门

这是一道暴力枚举。

 


 

大致题意:R行C列的棋盘要放下长度为K的线段,“#”表示无法放置,问有多少种放置方法。

直接贴代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string str;//读取字符串 
    int r,c,k,a[101][101],cnt=0;//数组a用来存储棋盘 
    cin>>r>>c>>k;//r表示行,c表示列,k表示线段长度 
    for(int i=1;i<=r;i++){
        cin>>str;//输入 
        for(int j=1;j<=c;j++){
            if(str[j-1]=='.')
            //将棋盘字符转为数值表示是否可以放置 
                a[i][j]=0;//0表示可以放置 
            else a[i][j]=1;//反之赋1不可放置 
        }
    }
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            if(a[i][j]==1||j+k-1>r)continue;
            //如果不可放置或无法容纳线段长度直接下一层循环 
            int flag=1;//标记是否有障碍物 
            if(a[i][j]==0){//可以放置 
                for(int l=j+1;l<j+k;l++){//枚举长度为k的线段 
                    if(a[i][l]==1){//从左往右枚举 
                        flag=0;//无法放置则标记为0 
                        break;//直接跳出循环 
                    }
                }
                if(flag==1)cnt++;//无障碍物,计数器+1 
            }
        }
    }
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            if(a[i][j]==1||i+k-1>c)continue;
            //如果不可放置或无法容纳线段长度直接下一层循环 
            int flag=1;//标记是否有障碍物  
            if(a[i][j]==0){//可以放置 
            for(int l=i+1;l<i+k;l++){//枚举长度为k的线段
                if(a[l][j]==1){//从上往下枚举 
                    flag=0;//无法放置则标记为0 
                    break;//直接跳出循环 
                }
            }
            if(flag==1)cnt++;// 无障碍物,计数器+1 
            }    
        }
    }
    if(k==1)cout<<cnt/2;
    //特判,如果线段长度为1,横向纵向会判断两次,除以2输出 
    else cout<<cnt;
    return 0;
}

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/zhangqixun/p/17065940.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!