ZOJ 1002

本文介绍了一种使用深度优先搜索(DFS)算法解决迷宫中放置最多数量碉堡的问题。通过递归地尝试每个位置,并检查是否违反放置规则,最终找出全局最优解。文章详细展示了算法实现过程及核心代码。

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


> http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2
> 原题地址

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
const int MAX = 10;
const int INF = 1000000000;

using namespace std;
int n, num, ans;
char maze[MAX][MAX];

bool legal(int row, int col); (判断是否可以放置碉堡)

void dfs(int k, int num);

int main()
{
    int i;
    while(scanf("%d", &n), n!=0)
    {
        ans=0;
        for(i=0; i<n; i++)scanf("%s", &maze[i]);

        num=0;
        dfs(0,num);
        printf("%d\n", ans);
    }
    return 0;
}

void dfs(int k, int num)
{
    if(k==n*n)                (用k来代替i, j.  方便回溯)
    {
        if(num>ans)ans=num;     (更新最大值)
        return ;
    }
    else
    {
        int i = k/n;  (行)
        int j = k%n;  (列)
          if(maze[i][j]=='.'&&legal(i,j))
            {
                maze[i][j]='@';   (标记当前位置)
                dfs(k+1,num+1);  
                maze[i][j]='.';    (回溯)
            }
        dfs(k+1,num);   (较难理解:用于统计当前位置不放置碉堡的可能的数量)
    }

}

bool legal(int row, int col)
{
    int i;
    for(i=row-1; i>=0; i--)     (当前列的上方是否可以放置)
    {
        if(maze[i][col]=='X')break;      (如果有墙,跳出)
        else if(maze[i][col]=='@')return false;    (如果同一列有炮台,当前位                               置不可放置)
    }
    for(i=row+1; i<n; i++)     (下方)
    {
        if(maze[i][col]=='X')break;
        else if(maze[i][col]=='@')return false;
    }
    for(i=col-1; i>=0; i--)    (左方)
    {
        if(maze[row][i]=='X')break;
        else if(maze[row][i]=='@')return false;
    }
    for(i=col+1; i<n; i++)     (右方)
    { 
        if(maze[row][i]=='X')break;
        else if(maze[row][i]=='@')return false;
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值