对于下面这组数据
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