两种方式,为什么其中一种过不了呢?
查看原帖
两种方式,为什么其中一种过不了呢?
1230414
Belka_Strelka楼主2023/12/18 03:26

首先这是最开始的代码

#include <bits/stdc++.h>
using namespace std;

int main() {
	int a,b,c,i,j,l=0,count=0;
	cin>>a>>b>>c;
	char d[a][b];
	int e[114514]={0};
	for(i=0;i<a;i++) cin>>d[i];
	for(i=0;i<a;i++){
		for(j=0;j<b;j++){
			if(d[i][j]=='.')
				e[l]++;
			else if(j>0&&d[i][j-1]=='.')
				l++;
		}
		l++;
	}
	for(j=0;j<b;j++){
		for(i=0;i<a;i++){
			if(d[i][j]=='.'){
				e[l]++;
			}
			else if(i>0&&d[i-1][j]=='.'){
				l++;
			}
		}
		l++;
	}
	for(i=0;i<114514;i++){
		if(e[i]>=c){
			count+=e[i]-c+1;
		}
	}
	cout<<count;
	return 0;
}

这段代码没有考虑人数只有一个的情况,所以横竖算了两次,重复了。 然后这是第二次的代码

#include <bits/stdc++.h>
using namespace std;

int main() {
	int a,b,c,i,j,l=0,count=0;
	cin>>a>>b>>c;
	char d[a][b];
	int e[114514]={0};
	for(i=0;i<a;i++) cin>>d[i];
	for(i=0;i<a;i++){
		for(j=0;j<b;j++){
			if(d[i][j]=='.')
				e[l]++;
			else if(j>0&&d[i][j-1]=='.')
				l++;
		}
		l++;
	}
	if(c!=1){
		for(j=0;j<b;j++){
			for(i=0;i<a;i++){
				if(d[i][j]=='.'){
					e[l]++;
				}
				else if(i>0&&d[i-1][j]=='.'){
					l++;
				}
			}
			l++;
		}
	}
	for(i=0;i<114514;i++){
		if(e[i]>=c){
			count+=e[i]-c+1;
		}
	}
	cout<<count;
	return 0;
}

想法是当人数=1的时候,不计算竖排的方案。但这么搞,以前能过的样例反而过不了了,只有20分。 然后这是第三次的

#include <bits/stdc++.h>
using namespace std;

int main() {
	int a,b,c,i,j,l=0,count=0;
	cin>>a>>b>>c;
	char d[a][b];
	int e[114514]={0};
	for(i=0;i<a;i++) cin>>d[i];
	for(i=0;i<a;i++){
		for(j=0;j<b;j++){
			if(d[i][j]=='.')
				e[l]++;
			else if(j>0&&d[i][j-1]=='.')
				l++;
		}
		l++;
	}
	
		for(j=0;j<b;j++){
			for(i=0;i<a;i++){
				if(d[i][j]=='.'){
					e[l]++;
				}
				else if(i>0&&d[i-1][j]=='.'){
					l++;
				}
			}
			l++;
		}
	
	for(i=0;i<114514;i++){
		if(e[i]>=c){
			count+=e[i]-c+1;
		}
	}
	if(c==1){
		count/=2;
	}
	cout<<count;
	return 0;
}

这次简单粗暴当人数=1的时候,结果/2,就过了。所以为什么第二次的过不了啊?

2023/12/18 03:26
加载中...