#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
using namespace std;

//*******************************************************************************************

/*
 *  穷取法寻找一条路径,若等于输入的边数则成功退出;
 *
*/
class GraphicData
{
public:
    int  signal;  //边索引号。
    char nodea;   //节点a。
    char nodeb;   //节点b。
    int  oriFir;  //是否有方向(0:无,1:有,2:可变)。
    int  oriSec;  //节点指向(0:a->b,1:b->a)。
    int  byCount; //边可通过次数 :1,2。
public:
    GraphicData(){}
    GraphicData(int s,int na,int nb,int or,int oc,int bt)
    {
        signal=s;
        nodea=na;
        nodeb=nb;
        oriFir=or;
        oriSec=oc;
        byCount=bt;
    }
};
typedef struct Table
{
   vector<GraphicData> v;   //存储容器表
   int seq;                 //存储遍历深度
   int dir;                 //存储方向0:a,1:b
}Ta;

typedef struct CharData
{
    char element;    //存储字符
    int seq;         //与Table 中索引一致
}CDa;
//********************************************************************************************
/*在容器中查找字符,将结果返回到迭代器中
    * a: 查找字符 ;
    * nextValue: 查找下一字符 ;
    * hse: 判断是否还有未扫描的边
*/
//容器中查找字符,返回bool值
bool findElem(vector<char>&vec,char seq)
{
    for(vector<char>::iterator it=vec.begin();it!=vec.end();it++)
    {
       if((*it)==seq)
           return true;
    }
    return false;
}
//查找字符,返回查找到的迭代器和指向
bool findChar(vector<GraphicData>&vec,vector<GraphicData>::iterator &it,char &Value,int &nextSig,int &hse,vector<char>& veceng)
{
    hse=0;
    while(it<vec.end())
    {
        //判断边是否可以通过
        if((*it).byCount>0)
        {
            hse=1;
            //判断方向:有(0);无(1);其中可变被包含
            if((*it).oriFir==0)
            {
                if((*it).nodea==Value &&!findElem(veceng,(*it).nodeb))
                {
                    nextSig=1;
                    return true;
                }
                else if((*it).nodeb==Value&&!findElem(veceng,(*it).nodea))
                {
                    nextSig=0;
                    return true;
                }
            }
            else if((*it).oriFir==1)
            {
                if((*it).oriSec==0)
                {
                    if((*it).nodea==Value &&!findElem(veceng,(*it).nodeb))
                    {
                        nextSig=1;
                        return true;
                    }
                }
                else
                {
                    if((*it).nodeb==Value &&!findElem(veceng,(*it).nodea))
                    {
                        nextSig=0;
                        return true;
                    }
                }
            }
            else if((*it).oriFir==2)
            {
                if((*it).oriSec==0)
                {
                    if((*it).nodea==Value &&!findElem(veceng,(*it).nodeb))
                    {
                        nextSig=1;
                        return true;
                    }
                }
                else
                {
                    if((*it).nodeb==Value &&!findElem(veceng,(*it).nodea))
                    {
                        nextSig=0;
                        return true;
                    }
                }
            }
        }
        it++;
    }
    return false;
}
//交换两元素的位置
template<typename T> void swap2(T &a,T &b)
{
    T temp=a;  a=b;    b=temp;
}
//计算总路径(包括重复的边)
int sumEdge(vector<GraphicData>&vec)
{
    int sum=0;
    for(vector<GraphicData>::iterator it=vec.begin();it!=vec.end();it++)
    {
        sum+=(*it).byCount;
    }
    return sum;
}
//查找字符,返回迭代器
void findIterator(vector<GraphicData>&vec,vector<GraphicData>::iterator &st,int seq)
{
     for(vector<GraphicData>::iterator it=vec.begin();it!=vec.end();it++)
     {
        if((*it).signal==seq)
        {
            st=it;
            break;
        }

}
}
//查找可变的边
void findVariable(vector<GraphicData>&vec,vector<char> &v)
{
    for(vector<GraphicData>::iterator it=vec.begin();it!=vec.end();it++)
    {
      if((*it).oriFir==2)
      {
          if((*it).oriSec==0)
            v.push_back((*it).nodea);
          else
            v.push_back((*it).nodeb);
      }
        
    }
}
//修改Table里面的值
void AlterVariable(vector<GraphicData>&vec,char &c)
{
    for(vector<GraphicData>::iterator it=vec.begin();it!=vec.end();it++)
    {
      if((*it).oriFir==2)
      {
         if((*it).oriSec==0 &&(*it).nodea==c)
         {
            (*it).oriFir=1;
            (*it).oriSec=1;
            break;
         }
         else if((*it).oriSec==1 &&(*it).nodeb==c)
         {
            (*it).oriFir=1;
               (*it).oriSec=0;
            break;
         }
          
      }
        
    }
}

//根据指定元素查找其他元素
/*
 *tempvec:存储结果
 *sig :指示方向 0:a 1:b
*/
bool runFinder(vector<GraphicData>&vec,
               vector<GraphicData>::iterator st,
               vector<CharData> &tempvec,
               const int sig)
{

stack<Table> sktable; //存储元素表
    stack<vector<GraphicData>::iterator> sktg;//存储元素索引
    Table vt;
    CharData ca;
    char tempc='0';
    int nextSig=0;    //下一个索引的方向
    tempvec.clear();  //清空缓存
    vector<char> veceng; //保存同一层
    vector<char> v2;     //存储可变的边
    findVariable(vec,v2);
//    cout<<"输出2的节点"<<endl;
//    for(int i=0;i<v2.size();i++)
//      cout<<v2[i]<<" ";
//    cout<<endl;
    //若开始就有方向可变边的节点,则后面的表要改变方向
    (*st).byCount--;
    if(v2.size()>0)
    {
        if(sig==1)
        {
            if(findElem(v2,(*st).nodeb))
            {
                AlterVariable(vec,(*st).nodeb);
            }
        }
        else
        {
            if(findElem(v2,(*st).nodea))
            {
                AlterVariable(vec,(*st).nodea);
            }
        }
    }
    //存储起始节点(0:a,1:b)
    if(sig==0)
    {
        ca.element=(*st).nodeb;
        ca.seq=1;
        tempvec.push_back(ca);
        vt.dir=0;
        vt.seq=1;
        vt.v=vec;
        sktable.push(vt);
           //cout<<"进栈: "<<(*st).nodea<<endl;
    }
    else
    {
            ca.element=(*st).nodea;
         ca.seq=1;
         tempvec.push_back(ca);
         vt.dir=1;
         vt.seq=1;
         vt.v=vec;
         sktable.push(vt);
          // cout<<"进栈: "<<(*st).nodeb<<endl;
    }
    sktg.push(st);
    //循环遍历以该节点为首的序列
    long depth=1;  //记录深度
    bool isSuccess=true;
    vector<GraphicData>::iterator tt;
    vector<GraphicData> veccopy=vec;
    while(!sktg.empty())
    {
        veceng.clear();
        vt=sktable.top();
        tt=sktg.top();
        
    //    if(vt.dir==0)
    //        cout<<"出栈: "<<(*tt).nodea<<endl;
    //    else
    //        cout<<"出栈: "<<(*tt).nodeb<<endl;
        sktable.pop();
        sktg.pop();
        ++depth;
        //若路径失败,刷新容器
        if(!isSuccess)
        {
            for(vector<CharData>::iterator it=tempvec.end()-1;it>=tempvec.begin();it--)
            {
                if((*it).seq==vt.seq)
                {
                    for(vector<CharData>::iterator st=it+1;st!=tempvec.end();)
                    {
                        st=tempvec.erase(st++);
                    }
                     break;
                }
            }
        }
        //存储出栈的字符
        if(vt.dir==0)
        {
           tempc=(*tt).nodea; //存储下一字符
           ca.element=(*tt).nodea;  
           ca.seq=depth;          
           tempvec.push_back(ca);
        }
        else
        {
           tempc=(*tt).nodeb;//存储下一字符
           ca.element=(*tt).nodeb;
           ca.seq=depth;
           tempvec.push_back(ca);
        }

int isFind=0; //判断循环是否执行
        int nes=0;    //判断是否还有未扫描的边
        vector<GraphicData> tempv=vt.v;
        tt=tempv.begin();
        char temchild='0';
        while(findChar(tempv,tt,tempc,nextSig,nes,veceng))
        {
            isFind=1;
            if((*tt).oriFir==2)
            {
                if((*tt).oriSec==1)
                    (*tt).oriSec=0;
                else
                    (*tt).oriSec=1;
            }    
            (*tt).byCount--;
            if(nextSig==0)
               temchild=(*tt).nodea;
            else
               temchild=(*tt).nodeb;
             //cout<<"进栈: "<<temchild<<endl;
            veceng.push_back(temchild);
            if(v2.size()>0)
            {
                if(nextSig==0)
                {
                    if(findElem(v2,(*tt).nodea))
                    {
                        AlterVariable(tempv,(*tt).nodea);
                    }
                }
                else
                {
                    if(findElem(v2,(*tt).nodeb))
                    {
                        AlterVariable(tempv,(*tt).nodeb);
                    }
                }
            }
            Table vtt;
            vtt.dir=nextSig;
            vtt.seq=depth;
            vtt.v=tempv;
            sktable.push(vtt);
            vector<GraphicData>::iterator ttmp;
            findIterator(veccopy,ttmp,(*tt).signal);
            sktg.push(ttmp);
            tempv=vt.v;
            tt=tempv.begin();
        }
         if(nes==0)
        {
            cout<<"--Result: find success!"<<endl;
            return true;      //路径成功,返回
        }
        else if(isFind==0 && nes==1)
        {
            isSuccess=false;  //路径失败!
        }
    }
    
    return false;
}

void main()
{

int noScanCount=0; //定义是否有未扫描的边数,若为0,则成功;
    cout<<"*****************************************"<<endl;
    vector<GraphicData> vec1;
    vec1.clear();
    int i=0;
    //cout<<"--Please enter bilateral relations!   "<<endl;
    cout<<"--Format:  <int signal,char nodea, char nodeb,int oriFir,int oriSec,int byCount>     "<<endl;
    cout<<"   --signal : bilateral index number."<<endl;
    cout<<"   --nodea  : node a."<<endl;
    cout<<"   --nodeb  : node b."<<endl;
    cout<<"   --oriFir : direction(0:no; 1:yes; 2:variable."<<endl;
    cout<<"   --oriSec : node direction(0:a->b,1:b->a)."<<endl;
    cout<<"   --byCount: the number of side which can be able to go"<<endl;
    /*while(i++<num)
    {
        cin>>data.signal>>data.nodea>>data.nodeb>>data.oriFir>>data.oriSec>>data.byCount;
        vec1.push_back(data);
    }
    */
    //**************************测试**********************************
/*
    GraphicData data4(4,'c','d',2,0,2);
    GraphicData data5(5,'a','b',0,0,1);
    GraphicData data3(3,'a','c',2,0,2);
     GraphicData data2(2,'a','d',0,0,2);
     GraphicData data1(1,'c','b',1,0,1);

vec1.push_back(data1);
     vec1.push_back(data2);
    vec1.push_back(data3);
     vec1.push_back(data4);
     vec1.push_back(data5);
*/
 
    GraphicData data1(1,'a','c',0,0,1);
    GraphicData data2(2,'d','b',0,0,1);
    GraphicData data6(3,'a','b',0,0,2);
    GraphicData data7(4,'c','d',0,0,2);

GraphicData data3(5,'a','j',0,0,1);
     GraphicData data4(6,'c','k',0,0,1);
    GraphicData data5(7,'b','m',0,0,1);
    GraphicData data8(8,'d','l',0,0,1);

GraphicData data9(9,'f','n',0,0,2);
    GraphicData data10(10,'i','n',0,0,2);
    GraphicData data11(11,'e','n',0,0,1);
    GraphicData data12(12,'n','h',1,0,2);

GraphicData data13(13,'k','f',1,0,2);
    GraphicData data14(14,'k','h',0,0,1);
    GraphicData data15(15,'h','l',0,0,1);
    GraphicData data16(16,'l','i',1,0,2);

GraphicData data17(17,'i','m',0,0,2);
    GraphicData data18(18,'m','e',0,0,1);
    GraphicData data19(19,'e','j',0,0,1);
    GraphicData data20(20,'j','f',0,0,2);

vec1.push_back(data1);
    vec1.push_back(data2);
    vec1.push_back(data3);
     vec1.push_back(data4);
 
    vec1.push_back(data5);
    vec1.push_back(data6);
    vec1.push_back(data7);
    vec1.push_back(data8);
    
    vec1.push_back(data9);
     vec1.push_back(data10);
      vec1.push_back(data11);
     vec1.push_back(data12);

vec1.push_back(data13);
    vec1.push_back(data14);
    vec1.push_back(data15);
     vec1.push_back(data16);
      
    vec1.push_back(data17);
     vec1.push_back(data18);
    vec1.push_back(data19);
     vec1.push_back(data20);
 
    //***************************************************************

vector<GraphicData> vec2=vec1;
    cout<<"--show bilateral inputed!"<<endl;
    for(vector<GraphicData>::iterator it=vec2.begin();it!=vec2.end();it++)
        cout<<"   ("<<(*it).signal<<","<<(*it).nodea<<","<<(*it).nodeb<<","<<(*it).oriFir<<","<<(*it).oriSec<<","<<(*it).byCount<<")"<<endl;

//<1>每遍历一个data,则其可通过次数-1,若容器中每个元素可通过次数都为0,则路径正确。
    //<2>若是方向可变边,扫描一次时,将其oriSec改变即可。
    int c2=sumEdge(vec2); //总路径
    cout<<"--TotalPath: "<<c2<<endl;
    vector<CharData> tempvec; //存储正确的连接顺序
    vector<GraphicData>::iterator st=vec2.begin(); //遍历迭代器
    vector<GraphicData>::iterator stb=vec2.begin();
    while(stb!=vec2.end())
    {
        noScanCount=0;
        if((*stb).oriFir==0)
        {
            if(runFinder(vec2,st,tempvec,0))  //0:a,1:b
            {
                noScanCount=1;
                break;
            }
            else
            {
                vec2=vec1;
                st=stb;
                if(runFinder(vec2,st,tempvec,1))
                {
                    noScanCount=1;
                    break;
                }
            }    
        }
        else
        {
            if((*stb).oriSec==0)
            {
                if(runFinder(vec2,st,tempvec,1))
                {
                    noScanCount=1;
                    break;
                }
            }
            else
            {
                if(runFinder(vec2,st,tempvec,0))
                {
                    noScanCount=1;
                    break;
                }
            }
            
        }
        stb++;
        st=stb;
        vec2=vec1;
    }
    if(noScanCount==1)
    {
        cout<<"  ";
        for(vector<CharData>::iterator it=tempvec.begin();it!=tempvec.end();it++)
            cout<<" "<<(*it).element<<" ->";
    }
    cout<<endl;
}

一笔画游戏路径搜索代码未优化相关推荐

  1. C语言strcpy函数模拟实现,未优化和已优化

    strcpy函数作用是把一个地址后面的字符串拷贝到另一个地址后面,因为字符串后面要加'\0',所以'\0'也要拷贝 //strcpy模拟实现①代码未优化时 #include<stdio.h> ...

  2. Silverlight C# 游戏开发:未写代码先设计

    本文只有两个主题: 1.游戏设计清晰的必要 2.循环逻辑的代码设计 游戏设计: 未写代码先设计,这是一个非常重要的建议,如果在写代码前还不知道要开发一个什么游戏,那么会遇上很多问题,这些问题包括: 代 ...

  3. 技术干货丨《大天使之剑H5》主程与项目总监:H5游戏的压缩与优化经验

    2019独角兽企业重金招聘Python工程师标准>>> 2018年3月,三七互娱在其主办的中国国际互动娱乐大会上称,<大天使之剑H5>最高单日流水超4000万元,而单月最 ...

  4. 飞机大战html游戏全代码js、jquery操作

    飞机大战html游戏全代码 博主的话 运行图片 目录路径 飞机大战.html style.css 进行下一个游戏的开发! 注意事项 博主的话 当时博主只会html,css和原生JavaScript,假 ...

  5. [转]游戏中各种性能优化方法(不断更新)

    http://www.cppblog.com/liangairan/archive/2013/03/23/198749.aspx 谈到游戏中的性能优化,说白了就是如何提高帧率和降低内存. 提高帧率的基 ...

  6. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  7. 什么叫python代码的优化_优化Python代码

    如果你的问题是关于优化python代码(我认为应该是这样),那么你可以做各种各样的intesting的事情,但是首先: 你可能不应该痴迷于优化python代码!如果您正在使用最快的算法来解决问题,并且 ...

  8. 一个C/S结构的优秀例子: 延迟补偿在C/S架构游戏协议设计和优化中的应用

    这篇文章介绍了cs这样的第一人称射击游戏中如何实现延迟补偿.非第一人称设计游戏设计也可以参考其中一些思想 原文地址: https://developer.valvesoftware.com/wiki/ ...

  9. python代码性能优化技巧

    python代码性能优化技巧 代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Pyth ...

最新文章

  1. 匿名发差评被判赔3272元,北京研究生遭遇冲上热搜,涉事机构回应:暂不澄清...
  2. 红透半边天的无服务器只是炒作吗?技术上如何发展?
  3. 滑动返回类库SwipeBackLayout的使用问题,解决返回黑屏,和看到桌面
  4. ISIS建立邻居的条件
  5. Visual Studio Code 中文设置教程
  6. 《京东技术解密》——海量订单处理
  7. java提高篇(七)-----关键字static
  8. gorm增删改查总结
  9. 李彦宏妻子马东敏向中国科大捐赠1亿 成立蔷薇基金
  10. tomcat9控制台中文乱码
  11. jQuery源码研究学习笔记(二)
  12. JavaScript常见笔试题分析
  13. 11_HTML5_Local_Storage本地存储
  14. React Native图片缓存解决方案
  15. JSK-10926 各位数字之和的和【入门】
  16. 【转】prufer编码
  17. ssh 遍历IPS 进行连接
  18. abp The value could not be converted to a GUID:
  19. 【原创】VBA学习笔记(6)VBE编辑器,VBA工程,各种窗口
  20. 求一元多项式 P(x) = a0 + a1x + a2x^2 + ... + anx^n 的值P(x0)。

热门文章

  1. 论下载需要注册账号和虚拟货币,并所谓的免费下载
  2. 20210515web渗透学习之域渗透简单实操
  3. 图像算法所用软件下载汇总
  4. 华为畅玩5X无Root查看已保存WiFi热点密码教程
  5. 韩国外交部:官网因萨德间歇性遭来自中国黑客攻击
  6. MTK-MT6735-camera新加模组调试总结
  7. NLU与NLG的区别(自然语言理解与自然语言生成的异同点)
  8. Dr.Elephant开发者指南
  9. ToDolist简述
  10. 工业机器人运动轨迹规划方法简述