zoj1002

本文探讨了如何在一个地图中最大化放置炮塔的数量,同时遵循特定规则:炮塔不能在同一行或同一列,但若被墙隔开则可放置。通过深度遍历算法和回溯,实现最优解。

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

       题目的意思是两个炮塔不能放在同一行或者同一列,但是如果同一行或同一列的两个炮塔中间被墙隔开,则两个炮塔可以放在同一行或同一列。问题是,给定一个地图,问在这个地图上最多能放几个炮塔。

      对于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--;
					}		
				}
			}
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值