热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hdu1401双向搜索(bfs)

题意是给你两个棋盘格局问由第一个最多搜8步能不能到达第二个格局;单项广搜应该能做注意优化就行我是想练一下双向所以这里就只说下双向的吧:和普通搜索一


题意是给你两个棋盘格局   问由第一个最多搜8步能不能到达第二个格局;

单项广搜应该能做    注意优化就行   我是想练一下双向  所以这里就只说下双向的吧:


和普通搜索一样    但由于起点终点的地位一样 (及起点也可以是终点,不要求求最小步数)  这样就可以让起点和终点各走4步   看有没有遇到的地方; 注意  这里的4个棋子都是一样的,导致你标记的时候不能简单的直接进行标记   (为此贡献了几次wa   唉  只怪当初太年轻)   我的处理上把4个棋子进行排序然后进行标记   标记数组开到八维 (尽量节省点     这里很容易爆内存 这里我是用到char型)    ‘a为第一次走的’  ‘b’为第二次走的             判断时若是‘a’则判断是第几次搜(若是第二次  则由重复的能到达)    其他就好解决了   


#include
#include
#include
#include
#include
using namespace std; struct Node { int x,y; }; struct node {
    Node point[4]; int step; }a,b; char mark[8][8][8][8][8][8][8][8]; int flash; int dir[4][2]={0,1,0,-1,1,0,-1,0}; int cmp(Node x,Node y) { if(x.x!=y.x) return x.x<y.x; return x.y<y.y; } int judgemap(node pp) { if(a.point[0].x<0||a.point[0].x>=8) return 1; if(a.point[0].y<0||a.point[0].y>=8) return 1; if(a.point[1].x<0||a.point[1].x>=8) return 1; if(a.point[1].y<0||a.point[1].y>=8) return 1; if(a.point[2].x<0||a.point[2].x>=8) return 1; if(a.point[2].y<0||a.point[2].y>=8) return 1; if(a.point[3].x<0||a.point[3].x>=8) return 1; if(a.point[3].y<0||a.point[3].y>=8) return 1; for(int i=0;i<3;i++) if(a.point[i].x==a.point[i+1].x&&a.point[i].y==a.point[i+1].y) return 1; return 0; } int bfs(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) {
    a.point[0].x=x1;
    a.point[0].y=y1;
    a.point[1].x=x2;
    a.point[1].y=y2;
    a.point[2].x=x3;
    a.point[2].y=y3;
    a.point[3].x=x4;
    a.point[3].y=y4;
    a.step=0;
    queue<node>q;
    sort(a.point,a.point+4,cmp); if(flash==0) mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='a'; else mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='c';
    q.push(a); while(!q.empty()) {
        b=q.front();
        q.pop(); if(b.step>=4) break; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) {
                a=b;
                a.step=b.step+1;
                a.point[i].x=b.point[i].x+dir[j][0];
                a.point[i].y=b.point[i].y+dir[j][1];
                sort(a.point,a.point+4,cmp); if(judgemap(a)) continue; if(mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]=='0') { if(flash==0) mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='a'; else mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='b';
                    q.push(a); } else if(mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]=='a') { if(flash==1) return 1; } } for(int j=0;j<4;j++) {
                a=b;
                a.step=b.step+1; if(i==j) continue; int t=a.point[i].x-a.point[j].x; if(a.point[i].y==a.point[j].y&&(t==1||t==-1)) {
                    a.point[i].x=a.point[j].x-t;
                    sort(a.point,a.point+4,cmp); if(!judgemap(a)) { if(mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]=='0') { if(flash==0) mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='a'; else mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='b';
                            q.push(a); } else if(mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]=='a') { if(flash==1) return 1; } } }
                t=a.point[i].y-a.point[j].y; if(a.point[i].x==a.point[j].x&&(t==1||t==-1)) {
                    a.point[i].y=a.point[j].y-t;
                    sort(a.point,a.point+4,cmp); if(!judgemap(a)) { if(mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]=='0') { if(flash==0) mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='a'; else mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]='b';
                            q.push(a); } else if(mark[a.point[0].x][a.point[0].y][a.point[1].x][a.point[1].y][a.point[2].x][a.point[2].y][a.point[3].x][a.point[3].y]=='a') { if(flash==1) return 1; } } } } } } return -1; } int main() { int x1,y1,x2,y2,x3,y3,x4,y4; while(~scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4)) {
        memset(mark,'0',sizeof(mark));
        x1--;y1--;x2--;y2--;x3--;y3--;x4--;y4--;
        flash=0;
        bfs(x1,y1,x2,y2,x3,y3,x4,y4);
        scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
        x1--;y1--;x2--;y2--;x3--;y3--;x4--;y4--;
        flash=1; int t=bfs(x1,y1,x2,y2,x3,y3,x4,y4); if(t<0) printf("NO\n"); else printf("YES\n"); } return 0; }

  


推荐阅读
  • 本文探讨了符号三角形问题,该问题涉及由相同数量的“+”和“-”符号组成的三角形。通过递归回溯法,可以有效地搜索并计算符合条件的符号三角形的数量。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文详细解释了为什么在成功执行移动赋值操作后,对象的析构函数会被调用,并提供了代码示例和详细的分析。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文介绍如何在Java中实现一个罗马数字计算器,重点在于如何通过循环和字符验证确保用户输入合法。我们将探讨创建一个方法来检查字符串中的非法字符,并使用循环不断提示用户输入,直到输入符合要求。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 本文详细探讨了 PHP 中常见的 '未定义索引' 错误,包括其原因、解决方案及最佳实践。通过实例和代码片段,帮助开发者更好地理解和处理这一常见问题。 ... [详细]
  • 本文详细介绍了指针变量的概念及其在编程中的应用。指针是一种特殊的变量,其值为内存地址。通过了解指针的声明、初始化及操作符的使用,可以更好地掌握C语言中指针的工作原理。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • Django 使用slug field时遇到的问题 ... [详细]
  • MySQL DATETIME 类型长度及使用指南
    本文详细介绍了 MySQL 中 DATETIME 类型的长度要求及其格式规范,并补充了其他常见数据类型的说明,帮助开发者更好地理解和使用这些类型。 ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
author-avatar
___墨浔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有