HDOJ 1045 Fire Net

本文介绍了一种使用深度优先搜索解决迷宫问题的方法。通过自定义的放置规则和搜索策略,实现了对迷宫的有效求解,并给出了完整的C语言实现代码。

       起始的时候是按照上下左右进行搜索的,然后不幸栈溢出。参考别人的实现才发现,原来迷宫还可以以索引为深度进行搜索。更改之后果断AC。由于搜索的时候是自左而右、自上而下的放置的,所以判断是否可以放置时,只需要判断左上的部分即可。

#include <stdio.h>
char maze[6][6];
int num,result;
bool placeable(int row,int col)
{
    int i;
    i=col-1;
    while(i>=0&&maze[row][i]!='X')
        if(maze[row][i--]=='*') return false;
    i=row-1;
    while(i>=0&&maze[i][col]!='X')
        if(maze[i--][col]=='*') return false;
    return true;
}
void dfs(int cnt,int max)
{
    int row,col;
    if(cnt==num*num)
    {
        max>result?result=max:1;
        return;
    }
    else
    {
        row=cnt/num;
        col=cnt%num;
        if(maze[row][col]=='.'&&placeable(row,col))
        {
            maze[row][col]='*';
            dfs(cnt+1,max+1);
            maze[row][col]='.';
        }
        dfs(cnt+1,max);
    }
}
int main()
{
    //freopen("Fire Net.txt","r",stdin);
    while(scanf("%d",&num)!=EOF&&num)
    {
        for(int i=0;i<num;i++)
            scanf("%s",maze[i]);
        result=0;
        dfs(0,0);
        printf("%d\n",result);
    }
    return 0;
}

转载于:https://www.cnblogs.com/AdaByron/archive/2011/10/10/2205525.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值