大概思路 就是dfs去遍历每个格子 去当前位置每行每列去放在模块 当放置一个模块的时候 去判断这一行这一列是否有已经放置过的模块 直至全部遍历
AC代码
import java.util.Scanner;
public class Main{
/**
* @param args
*/
static int n;
static char map[][]=new char[5][5];
static int dx[] = {1,-1,0,0};
static int dy[] = {0,0,1,-1};
static int max;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
while((n=scan.nextInt())>0){
for(int i=0;i<n;i++){
String str=scan.next();
char a[]=str.toCharArray();
for(int j=0;j<a.length;j++){
map[i][j]=a[j];
}
}
max=0;
dfs(0);//遍历
System.out.println(max);
}
}
private static void dfs(int ans) {
// TODO Auto-generated method stub
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(ok(i,j)){//去判断当前位置是否可以放置模块
map[i][j]='1';
dfs(ans+1);
map[i][j]='.';//回溯
}
}
if(max<ans){
max=ans;
}
}
}
private static boolean ok(int x, int y) {
// TODO Auto-generated method stub
int x1,y1;
if(map[x][y]!='.')
return false;
for(int i=0;i<4;i++){
x1=x+dx[i];
y1=y+dy[i];
while(true){
if(x1<0||y1<0||x1>=n||y1>=n||map[x1][y1]=='X')
break;
else if(map[x1][y1]=='1'){
return false;
}
x1+=dx[i];
y1+=dy[i];
}
}
return true;
}
}