题目链接:点击打开链接
题目大意:在一个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;
}
}