当前位置: 首页 > 编程日记 > 正文

ZOJ1002 Fire Net(非递归版)

以前用递归的回溯搜索思路做过一次,参ZOJ1002 Fire Net(递归版),今天想着用非递归的方法试试看,呵呵,比我想象中要难啊,主要还是堆栈里究竟放什么,这一点上思路一直没理清。因此用了整整一天的时间,总算用非递归的方法把1002AC掉了,在代码中我引入了堆栈层次的概念,模拟系统堆栈的行为,并且在搜索时加入了剪枝,但代码写得还是很烂,继续思考如何改进。

/********************************
Written by : phinecos(洞庭散人)
Data       : 2/11/2008 16:30
Description: 非递归,模拟系统堆栈解决类似八皇后问题
State : Accepted
Run Time: 0ms
Run Memory:    184KB
***************************************
*/

#include
<iostream>
#include 
<stack>
using namespace std;

const int MAXSIZE = 4;// 地图最大大小
char map[MAXSIZE][MAXSIZE];// 地图
int maxNum,n;

struct Node
{
    
int row;//
    int col;//
    int level;//当前层次
};

bool CanPut(int row, int col)
{
//测试是否可以放置碉堡到row行col列处,因为位置是从小到大前进的,因此只需要测试比待测试点小的位置
    int i;
    
//测试col列上是否有面对面的碉堡
    for (i = row - 1; i >= 0--i)
    {
        
if (map[i][col] == 'O'return false;
        
if (map[i][col] == 'X'break;
    }
    
//测试row行上是否有面对面的碉堡
    for (i = col - 1; i >= 0--i)
    {
        
if (map[row][i] == 'O'return false;
        
if (map[row][i] == 'X'break;
    }
    
return true;
}

void Solve(int k,int curNum)
{
    stack
<Node> s1;//解决树堆栈
    Node node;
    
int row,col,i;
    
int curLevel = 0;//当前层次

    
//起始结点入栈
    node.row=k/n;
    node.col 
= k%n;
    node.level 
= curLevel;//当前堆栈层次是第0层
    s1.push(node);

    
while (!s1.empty())
    {
        node 
= s1.top();
        row 
= node.row;
        col 
= node.col;
            
        
if (map[row][col]=='.'&&CanPut(row,col)==true)
        {
//map[row][col]空闲并且经测试可以放置,则占据此位置
            map[row][col] = 'O';
            
//堆栈层次加1
            curLevel++;
            node.level 
= curLevel;//作为这个堆栈层此的排头兵
            s1.pop();
            s1.push(node);
            curNum
++;//放置的棋子数目加1
        }

        
if (row==n-1&&col==n-1)
        {
//来到这个堆栈层的最后一个结点了
            if (curNum>maxNum)
            {
//保存这一层的最大数目
                maxNum = curNum;
            }
            
if (curLevel==0)
            {
//若回到第0层,则说明已经考虑完所有情况了
                break;
            }

            
/*
            *下面这段代码非常低级趣味,我居然用了两重while循环,It's rubbish,不喜勿进!!!!
            
*/

            
//去掉当前堆栈层
            while (!s1.empty())
            {
                node 
= s1.top();
                
if (node.level==curLevel)
                {
                    s1.pop();
                    
--k;
                }
                
else
                {
                    curLevel
--;
                    curNum
--;
                    
break;
                }
            }
            
//有一种情况是栈此时是空的,但还是需要将层次数和棋子数减1,因为循环中它给跳过去了。。。汗。
            if(s1.empty())
            {
                curLevel
--;
                curNum
--;
            }
            
//将上一层的排头兵恢复回来(就是把'O'再此变回'.',并且层次改为这一层)
            ++k;
            row 
= k/n;
            col 
= k%n;
            map[row][col] 
= '.';
            node.row 
= row;
            node.col 
= col;
            node.level 
= curLevel;
            s1.push(node);
            
//以上一层排头兵的下一个结点为起点,继续
            if (k+1<n*n)
            {
                
++k;
                node.row 
= k/n;
                node.col 
= k%n;
                node.level 
= curLevel;
                s1.push(node);
            }
            
else
            {
//当来到最后一个元素时,又有一个特殊的情形,此时当前层次所有情况都已经考虑完毕,因此需要将当前堆栈层给清空掉,哎,这个清空动作和前面是一样的,可居然又单独列了遍代码,吐了。。。
                if (curLevel==0)
                {
                    
break;
                }
                
while (!s1.empty())
                {
                    node 
= s1.top();
                    
if (node.level==curLevel)
                    {
                        s1.pop();
                        
--k;
                    }
                    
else
                    {
                        curLevel
--;
                        curNum
--;
                        
break;
                    }
                }

                
if (s1.empty())
                {
                    curLevel
--;
                    curNum
--;
                }
                
++k;
                row 
= k/n;
                col 
= k%n;
                map[row][col] 
= '.';
                node.row 
= row;
                node.col 
= col;
                node.level 
= curLevel;
                s1.push(node);

                
++k;
                node.row 
= k/n;
                node.col 
= k%n;
                node.level 
= curLevel;
                s1.push(node);
            }
            
        }
        
else
        {
//还没来到这一堆栈层次的最后一个节点,继续吧
            ++k;
            node.row 
= k/n;
            node.col 
= k%n;
            node.level 
= curLevel;
            s1.push(node);
        }
    }
}

int main()
{
    
int i,j;
    
while(cin>>n&&n!=0)
    {
        
//输入地图
        for(i=0;i<n;i++)
        {
            
for(j=0;j<n;j++)
            {
                cin
>>map[i][j];
            }
        }
        maxNum
=0;//最多可能放置的数目
        
//开始深搜,起点设置为左上角
        Solve(0,0);
        cout
<<maxNum<<endl;
    }
    
return 0;
}

相关文章:

“数学不行,干啥也不行”骨灰级程序员:其实你们都是瞎努力

编程圈一直都流传着一个段子&#xff1a;一流程序员靠数学&#xff0c;二流程序员靠算法&#xff0c;末端程序员靠百度&#xff0c;低端看高端就是黑魔法。懂的人其实都知道&#xff0c;这不是段子&#xff0c;其实就是程序员的真实写照。想一想&#xff0c;我们日常学习、求职…

Google Test(GTest)使用方法和源码解析——死亡测试技术分析和应用

死亡测试是为了判断一段逻辑是否会导致进程退出而设计的。这种场景并不常见&#xff0c;但是GTest依然为我们设计了这个功能。我们先看下其应用实例。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 死亡测试技术应用 我们可以使用TEST声明并注册一个简单的测…

java学习笔记11--Annotation

java学习笔记11--Annotation Annotation&#xff1a;在JDK1.5之后增加的一个新特性&#xff0c;这种特性被称为元数据特性&#xff0c;在JDK1.5之后称为注释&#xff0c;即&#xff1a;使用注释的方式加入一些程序的信息。 java.lang.annotation Annotation接口是所有的Annotat…

GoogleLog(GLog)源码分析

GLog是Google开发的一套日志输出框架。由于其具有功能强大、方便使用等特性&#xff0c;它被众多开源项目使用。本文将通过分析其源码&#xff0c;解析Glog实现的过程。 该框架的源码在https://github.com/google/glog上可以获取到。本文将以目前最新的0.3.3版本源码为范例进行…

Ajax Toolkit 控件学习系列(13) ——FilteredTextBoxExtender 控制输入

这个控件的作用是对TextBox所要输入的内容进行过滤控制。按照自己需要过滤&#xff0c;可以自定义&#xff0c;再或者使用定义好的方式。看效果。效果不是很突出&#xff0c;说明下&#xff0c;就是只能输入大写字母和数字。因为加了限制&#xff0c;但是具体有什么高深的应用呢…

Uber最新开源Manifold,助力机器学习开发者的可视化与调试需求

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者 | Lezhi Li译者 | 凯隐编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】2019 年 1 月&#xff0c;Uber 推出了 Manifold&#xff0c;一款与模型无…

jQuery对象和DOM对象使用说明

1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象&#xff0c;哪些是 DOM对象&#xff0c;因此需要重点了解jQuery对象和DOM对象以及它们之间的关系.DOM对象&#xff0c;即是我们用传统的方法(javascript)获得的对象&#xff0c;jQuery对象即是用jQuery类库…

[WPF疑难]避免窗口最大化时遮盖任务栏

[WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是&#xff1a;如果窗口的WindowStyle被直接或间接地设置为None后&#xff08;比如很多情况下你会覆盖默认的窗体样式&#xff0c;即不采用Windows默认的边框和最大化最等按钮&#xff0c;来打造个…

Google Mock(Gmock)简单使用和源码分析——简单使用

初识Gmock是之前分析GTest源码时&#xff0c;它的源码和GTest源码在同一个代码仓库中&#xff08;https://github.com/google/googletest&#xff09;。本文我将以目前最新的Gmock1.7版本为范例&#xff0c;分析其实现原理。&#xff08;转载请指明出于breaksoftware的csdn博客…

浪潮刘军:为什么说计算力是AI时代“免费的午餐”?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;产业AI、元脑生态是浪潮集团2019年度的两大关键词。作为一家以计算力为核心生产力的企业&#xff0c;浪潮还一直强调人工智能计算是未来最重要的计算力&#xff0c;而无论产业AI、元脑生态都构筑于计算的基础设施之上。…

Journey源码分析四:url路由

2019独角兽企业重金招聘Python工程师标准>>> 在入口函数main()的default分支中&#xff0c;对路由进行了注册&#xff0c;现在分析下。 ##main()中路由注册相关代码 源码: httpRouter : httptreemux.New() // Blog and pages as http server.InitializeBlog(httpRou…

“天河二号”总工程师杜云飞谈星光超算应用平台设计

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】12 月 21-22 日&#xff0c;OpenI/O 启智开发者大会在深圳召开。在大会上&#xff0c; 国家超级计算广州中心总工程师、“天河二号”总工程师杜云飞发表了题为《星光超算应用平台》的主题报告&…

Google Mock(Gmock)简单使用和源码分析——源码分析

源码分析 通过《Google Mock(Gmock)简单使用和源码分析——简单使用》中的例子&#xff0c;我们发现被mock的相关方法在mock类中已经被重新实现了&#xff0c;否则它们也不会按照我们的期待的行为执行。我们通过阅读源码&#xff0c;来分析整个过程的实现逻辑。&#xff08;转载…

远程控制软件VNC教程和对内网机器控制的实现

网络遥控技术是指由一部计算机&#xff08;主控端&#xff09;去控制另一部计算机&#xff08;被控端&#xff09;&#xff0c;而且当主控端在控制端时&#xff0c;就如同用户亲自坐在被控端前操作一样&#xff0c;可以执行被控端的应用程序&#xff0c;及使用被控端的系统资源…

GRUB2相关概念

GNU GRUB&#xff0c;简称“GRUB”&#xff0c;是一个来自GNU项目的启动引导程序。GRUB是多启动规范的实现&#xff0c;它允许用户可以在计算机内同时拥有多个操作系统&#xff0c;并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核&#xff0c…

朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型

做Linux网络开发&#xff0c;一般绕不开标题中几种网络编程模型。网上已有很多写的不错的分析文章&#xff0c;它们的基本论点是差不多的。但是我觉得他们讲的还不够详细&#xff0c;在一些关键论点上缺乏数据支持。所以我决定好好研究这几个模型。&#xff08;转载请指明出于b…

支付宝账单出来后,除了总消费,你看到你的学习支出了吗?

当支付宝的2019年年度账单出来的时候很多人的第一反应就是我怎么花了这么多钱不少人都有这样的困惑忙忙碌碌一年到头&#xff0c;到底得到了什么&#xff1f;而这一切又和自己最开始的规划一样吗&#xff1f;其实从账单上可以看出你在2019年花费了哪些大头居家生活、穿衣打扮还…

体验Windows 7的Superbar

随着PDC 2008上Windows 7 M3 6801的发布&#xff0c;这个微软的下一代操作系统也渐渐浮出了水面。对于我们这些普通的PC用户而言&#xff0c;Windows 7相对于Windows Vista最显而易见的改变&#xff0c;无疑就是著名的Superbar任务栏了。说起它相比于原来的任务栏变化&#xff…

Linux 安装图形界面及远程连接

#可查询哪些组件是否已经安装(可用来对照组件名称&#xff09; yum grouplistyum groupinstall X Window System -y #安装GNOME桌面环境 yum groupinstall GNOME Desktop Environment -y #安装KDE桌面环境 yum groupinstall KDE (K Desktop Environment)卸载 卸载GNOME桌面环境…

朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型

在《朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型》中我们分析了朴素模型的一个缺陷——一次只能处理一个连接。本文介绍的Select模型则可以解决这个问题。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 和朴素模型一样&#xff0c;我们首先…

微软开源NAS算法Petridish,提高神经网络迁移能力

作者 | Jesus Rodriguez译者 | Rachel编辑 | 夕颜出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 【导读】神经架构搜索&#xff08;Neural architecture search, NAS&#xff09;是深度学习中最热门的趋势之一。NAS方法针对特定问题和数据…

[转]g++ 编译多个相关文件

三个文件&#xff0c;一个头文件&#xff0c;两个程序文件 /*d.h */#include <iostream>usingnamespacestd; classDataset { public: intgetdata(); }; /*d.cpp */#include "d.h"intDataset::getdata() { return1231; } /*out.cpp */#include <ios…

POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量

联系&#xff1a;http://poj.org/problem?id2391 题意&#xff1a;有f个草场&#xff0c;每一个草场当前有一定数目的牛在吃草&#xff0c;下雨时它能够让一定数量的牛在这里避雨&#xff0c;f个草场间有m条路连接&#xff0c;每头牛通过一条路从一点到还有一点有一定的时间花…

25年了,我总结出这些信息提取的经验教训

作者 | Ehud Reiter译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】近日&#xff0c;本文作者阿伯丁大学计算科学系教授 Ehud Reiter 及其带领的阅读小组读了一篇让他们印象深刻的论文——由 Ralph Grishman 发表的《信息提取 25 年》&#xff08…

朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型

在《朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型》中&#xff0c;我们分析了它只能支持1024个连接同时处理的原因。但是在有些需要同时处理更多连接的情况下&#xff0c;1024个连接往往是不够的&#xff0c;也就是不能够高并发。那么这个时候我们就可以采用…

flashcom中远程共享对象SharedObject的用法

觉得这篇文章比较好&#xff0c;转载回来。学习fcs也有差不多一个月了,感觉最有特色的东西还是SharedObject.SharedObject有不少东西,本地操作就不说了(相信很多人没接触fcs也用过);就说说远程共享对象吧.基本的应用流程是:my_nc new NetConnection(); my_nc.connect("rt…

Hive-1.2.0学习笔记(一)安装配置

鲁春利的工作笔记&#xff0c;好记性不如烂笔头下载hive&#xff1a;http://hive.apache.org/index.htmlHive是基于Hadoop的一个数据仓库工具&#xff0c;提供了SQL查询功能&#xff0c;能够将SQL语句解析成MapReduce任务对存储在HDFS上的数据进行处理。MySQ安装Hive有三种运行…

邮件安全隐患及其防范技术研究

邮件安全隐患及其防范技术研究<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />陈小兵【antian365.com】摘要电子邮件是Internet上使用最为频繁和广泛的服务&#xff0c;在给人们带来便利的同时&#xff0c;亦带来令人担忧的邮件…

必看!52篇深度强化学习收录论文汇总 | AAAI 2020

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送来源 | 深度强化学习实验室&#xff08;ID:Deep-RL&#xff09;作者 | DeepRLAAAI 2020 共收到的有效论文投稿超过 8800 篇&#xff0c;其中 7737 篇论文进入评审环节&#xff0c;最终收录数量…

朴素、Select、Poll和Epoll网络编程模型实现和分析——Epoll模型

在阅读完《朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型》和《朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型》两篇文章后&#xff0c;我们发现一个问题&#xff0c;不管select函数还是poll函数都不够智能&#xff0c;它们只能告诉我们成功…