ZOJ--1002:Fire_Net

来源:互联网 发布:淘宝的宝贝网址怎么看 编辑:程序博客网 时间:2024/05/27 01:24

题目链接:点击打开链接

题目大意:在一个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;}}


原创粉丝点击