关于判断方形的顺序问题,求神犇解答!
  • 板块P1331 海战
  • 楼主cui_can
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/7/17 14:32
  • 上次更新2023/11/4 14:30:35
查看原帖
关于判断方形的顺序问题,求神犇解答!
444267
cui_can楼主2021/7/17 14:32

对于下面这组数据

6 6
.....#
##...#
##...#
..#..#
.....#
######

只有在深搜‘#’的循环前加循环判断语句才有效 对的

不然在同一个循环中会失效 错的

if(bad(i,j)==0){
	printf("Bad placement.\n");
	return 0;
} 	

AC代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ans;
char mp[1005][1005];
int dx[]={-1,0,0,1};
int dy[]={0,-1,1,0};
void dfs(int x,int y){
	for(int i=0;i<4;i++){
		int nx=x+dx[i],ny=y+dy[i];
		if(nx<1||nx>n||ny<1||ny>m)continue;
		if(mp[nx][ny]=='#'){
			mp[nx][ny]='.';
			dfs(nx,ny);
		}
	}
	return;
}
bool bad(int x,int y){
	int c=0;
	if(mp[x][y]=='#')c++;
	if(mp[x+1][y]=='#')c++;
	if(mp[x][y+1]=='#')c++;
	if(mp[x+1][y+1]=='#')c++;
	if(c==3)return 0;
	else return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%s",mp[i]+1);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(!bad(i,j)){
				printf("Bad placement.\n");
				return 0;
			} 		
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(mp[i][j]=='#'){
				mp[i][j]='.';dfs(i,j);ans++;
			}		
		}
	printf("There are %d ships.\n",ans);
	return 0;
} 

错误代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ans;
char mp[1005][1005];
int dx[]={-1,0,0,1};
int dy[]={0,-1,1,0};
void dfs(int x,int y){
	for(int i=0;i<4;i++){
		int nx=x+dx[i],ny=y+dy[i];
		if(nx<1||nx>n||ny<1||ny>m)continue;
		if(mp[nx][ny]=='#'){
			mp[nx][ny]='.';
			dfs(nx,ny);
		}
	}
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%s",mp[i]+1);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(mp[i][j]=='#'){
				mp[i][j]='.';dfs(i,j);ans++;
			}		
		}
	printf("There are %d ships.\n",ans);
	return 0;
} 

求解惑 qwq

2021/7/17 14:32
加载中...