P1331 海战 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
此题难点在三处。
其一:题目中说如果两个舰船相连视为不合法,而每个舰船又是方形的。这句话我们思考转换成代码就是我们要找连通块,而且这个联通块是方形的。即我们统计联通块的正方形个数,并且我们统计连通块的长与宽,如果长乘宽等于面积,那就加一,否则不合法
其二:在输入数组的长与宽之后写入一个输入来读取换行符
其三:每读取一个#号就把其变为另一个符号。
上代码
package qq;
import java.security.PublicKey;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
import java.util.TreeSet;
import java.util.function.IntPredicate;
public class main{
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
bb=sc.nextInt();
cc=sc.nextInt();
aa=new char[bb][cc];
sc.nextLine();//吸收输入里的换行符
int a,b,c;
for(a=0;a<bb;a++) {
aa[a]=sc.nextLine().toCharArray();//读取字符
}
for(a=0;a<bb;a++) {
for(b=0;b<cc;b++) {
if(aa[a][b]=='#') {
aa[a][b]='0';
xx0=a;//读入初始的横坐标与纵坐标
yy0=b;
length=1;//长与宽设为1
wide=1;//
area=1;
dfs(a,b);//开始dfs
if(area==length*wide) {
ans++;
}
else {
//System.out.println(a+" "+b);//纠正错误时写的,读者掠过
//System.out.println(area+" "+wide+" "+length);
System.out.println("Bad placement.");
return;
}
}
}
}
System.out.println("There are "+ans+" ships.");
}
public static char[][] aa;
public static int bb,cc;
public static int length,wide;
public static int ans=0;
public static int area=0;
public static int xx0,yy0;
public static int[] xx= {-1,0,0,1};
public static int[] yy= {0,-1,1,0};
public static void dfs(int a,int b) {
for(int f=0;f<4;f++) {
int x2=a+xx[f];
int y2=b+yy[f];
if(x2<0||x2>=bb||y2<0||y2>=cc) {
continue;
}
if(aa[x2][y2]=='#') {
aa[x2][y2]='0';
if(x2==xx0) {
统计长度
length++;
}
else if(y2==yy0){
统计宽度
wide++;
}
area++;面积加加
dfs(x2, y2);
}
}
}
}