ZOJ--1002:Fire_Net

本文解析了一道关于在带有障碍物的城市地图中放置堡垒的算法题。目标是找到最多能放置多少堡垒,使得每个街道都能被至少一个堡垒覆盖。文章详细介绍了通过递归搜索和判断条件来解决该问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接

题目大意:在一个n*n的城市里 有墙  在没有墙的地方可以放堡垒,堡垒可以打到东南西北四个方向的任何东西(包括堡垒)但不可以打穿墙,现在在城市里放堡垒 可以使其打到         任何一条街道的任何地方。 求可以放置堡垒的最大数。

    输入:先输入n表示城市的边长(最长为4),若n为0结束。

    输出:输出每一个城市样例的最大堡垒数

例:

Sample input:(X表示墙,.表示街道,无空格输入)

4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0

Sample output: 
5
1
5
2
4
思路

     用一个数组存放城市的地图,直接一行一行递归,每次都是列数(c)加一,若c等于n+1,则行数(r)加一 、c此刻为0

下面上代码:

import java.util.Scanner;

public class Main{
	static int n,max=0,count=0;
	static char arr[][];
	static boolean row[],column[];
	public static void main(String[]args){
		Scanner s=new Scanner(System.in);
		while((n=s.nextInt())!=0){
			arr=new char[n][n];
			row=new boolean[n];
			column=new boolean[n];
			for(int i=0;i<n;i++){
				String str=s.next();
				for(int j=0;j<n;j++){
					arr[i][j]=str.charAt(j);
				}
			}
			dfs(0,0);
			System.out.println(max);
			max=0;
		}	
	}
	public static void dfs(int r,int c){
		if(r==n-1&&c==n-1){
			if(judge(arr[r][c],r,c)){
				count++;
				if(max<count)
					max=count;
				count--;
			}
			else if(max<count)
				max=count;
			return;
		}
		if(judge(arr[r][c],r,c)){
				count++;
				row[r]=true;
				column[c]=true;
				if(c==n-1)
					dfs(r+1,0);
				else dfs(r,c+1);
				count--;
				row[r]=false;
				column[c]=false;
		}
		if(c==n-1)
			dfs(r+1,0);
		else dfs(r,c+1);;
	}
	public static boolean judge(char k,int i,int j){
		if(k=='X'){
			if(i<n-1)column[j]=false;
			if(j<n-1)row[i]=false;
			return false;
		}
		if(row[i]||column[j])return false;
		return true;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值