这是一道暴力枚举。
大致题意: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; }
标签:洛谷,int,题解,线段,Step,放置,P3654,长度 From: https://www.cnblogs.com/zhangqixun/p/17065940.html