深搜dfs之洛谷P1331 海战

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);
    		}
    	}
    }
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值