题目的意思是两个炮塔不能放在同一行或者同一列,但是如果同一行或同一列的两个炮塔中间被墙隔开,则两个炮塔可以放在同一行或同一列。问题是,给定一个地图,问在这个地图上最多能放几个炮塔。
对于n个元素的地图来说,每个空格如果不是墙,则先需要判断能不能放炮塔,如果能,又可以有2种选择,一是放,二是不放,每一种可能都需要遍历到。
def canput(maze,n,row,col):
for i in range(col-1,-1,-1):
if maze[row][i]=='X':
break
if maze[row][i]=='1':
return False
for j in range(row-1,-1,-1):
if maze[j][col]=='X':
break
if maze[j][col]=='1':
return False
return True
def firenet(maze,n,k=0,c=0):
global maxc
if k>=n*n:
if c>maxc:
maxc=c
return
i = k//n
j = k%n
if maze[i][j]=='.' and canput(maze,n,i,j):
maze[i][j] = '1'
firenet(maze,n,k+1,c+1)
maze[i][j] = '.'
firenet(maze,n,k+1,c)
maxc = 0
N = int(raw_input())
while N!=0:
maze=[]
maxc = 0
for i in range(N):
sTmp = raw_input()
lst=[]
for j in range(N):
lst.append(sTmp[j])
maze.append(lst)
firenet(maze,N)
print maxc
N = int(raw_input())
另外一种方法是,对访问过的空格打上标签,只不过这种方法很可能会超时
public static void firenet(char[][] maze, int n, int[][] vst, int c,int dep){
if(dep>=n*n){
if(maxc<c){
maxc=c;
}
return;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(vst[i][j]==0){
if(maze[i][j]=='.' && canput(maze, n, i, i)){
maze[i][j]='1';
c++;
}
vst[i][j]=1;
firenet(maze,n,vst,c,dep+1);
vst[i][j]=0;
if(maze[i][j]=='1'){
maze[i][j]='.';
c--;
}
}
}
}
}