#4、#5有问题
查看原帖
#4、#5有问题
848012
Nightmare486楼主2024/7/25 11:24

思路:先判断行列够不够站k个人,然后分别遍历计算行和列,ansr、ansc记录位置的个数,判断和k相等就ansrr、anscc加一即为一种方法,然后ansr、ansc减一(避免多座少法),碰到障碍或换行、列就清零,最后输出ansrr+anscc

#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>

using namespace std;
int r,c,k,ansr=0,ansc=0,ansrr=0,anscc=0;
char map[105][105];
int main(){
	cin>>r>>c>>k;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			cin>>map[i][j];
		}
	}
	if(k>r && k>c){
		cout<<0<<endl;
		return 0;
	}
	
	if(k<=r){
		for(int i=1;i<=r;i++){
			for(int j=1;j<=c;j++){
				if(map[i][j]!='#'){
					ansr++;
					if(ansr==k) {
						ansrr++;
						ansr-=1;
					}
				}
				else{
					ansr=0;
				}
			}
			ansr=0;
		}
	} 
	
	if(k<=c){
		for(int i=1;i<=c;i++){
			for(int j=1;j<=r;j++){
				if(map[j][i]!='#'){
					ansc++;
					if(ansc==k) {
						anscc++;
						ansc-=1;
					}
				}
				else{
					ansc=0;
				}
			}
			ansc=0;
		}
	}
	cout<<ansrr+anscc<<endl;
	return 0;
}
2024/7/25 11:24
加载中...