有谁知道为什么我的程序停止推送到堆栈

时间:2016-05-10 04:23:22

标签: c++ stack

我试图用堆叠来解决8个难题。这段代码只知道是否 程序可以做到 。 程序迭代第一个字符串,完成工作,但是在推送了2个新字符串之后。它只是弹出它们但不继续使用这些功能。

任何人都知道我该怎么办?

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include "stack.cpp"

using namespace std;

bool checkFound(string meta,string aVer);
string converArretoString(STACK <string> stack, string ac);
void crearPosibilidad(STACK <string> open,string ac);
void checkRow(STACK <string> stack, int actual[3][3],int row,int col);
void checkCol(STACK <string> stack, int actual[3][3],int row,int col);

int main(int argc, char** argv)
{
    string meta="012345678";
    string actual="120345678";
    STACK <string> state;
    STACK <string> ustate;
    STACK <string> steps;

    state.push(actual);
    while (!state.empty())
    {   
        actual.clear();
        actual=state.pop();
       // cout<<actual<<endl;
        if(checkFound(meta,actual))
        {   
            cout<<actual;
            cout<< "lo encontramos";
            return 0;
        }

            //cout<<actual<<endl;
            ustate.push(actual);
          crearPosibilidad(state,actual);

    }
 return 0;
}
//checa si se encontro la solucion
bool checkFound(string meta,string aVer)
{
    if(aVer==meta)
    {
        return true;
    }
    return false;
}
//creara los posibles escenarios
void crearPosibilidad(STACK <string> state,string ac)
{
    int act [3][3];
    int i=-1;
    int col=0;
    int ren=0;
    string a;
    for (int r = 0; r<3; r++)
    {
        for(int c=0;c<3;c++)
        {
            i++;
           a=ac[i];
            act[r][c]=stoi(a);
            if (act[r][c]==0)
            {
                cout<<r<<endl;
                cout<<c<<endl;
                ren=r;
                col=c;
            }
        }
    }
    checkCol(state,act,ren,col);
    checkRow(state,act,ren,col); 
}

string converArretoString(int actual[3][3])
{
    string temp;
    ostringstream conver;
    for(int r=0;r<3;r++)
    {
        for(int c=0;c<3;c++)
        {
            conver<<actual[r][c];
        }
    }
    temp=conver.str();
    cout<<temp<<endl;
    return temp;
}
void checkRow(STACK <string> stack, int actual[3][3],int row,int col)
{
    int temp;
    string tems;
    if(row==0)
    {
        //mover abajo
        temp=actual[row+1][col];
        actual[row][col]=temp;
        actual[row+1][col]=0;
        tems=converArretoString(actual);
        //cout<<tems<<endl;
        if(!stack.search(tems))
        {
          //  cout<<tems<<endl;
            stack.push(tems);
        }
        //original
        temp=actual[row][col];
        actual[row+1][col]=temp;
        actual[row][col]=0;
    }
    if(row==1)
    {   //moverabajo
        temp=actual[row+1][col];
        actual[row][col]=temp;
        actual[row][col]=0;
        tems=converArretoString(actual);
        //cout<<tems<<endl;
        if(!stack.search(tems))
        {
           // cout<<tems<<endl;
            stack.push(tems);
        }
        //mover arriba
        temp=actual[row][col];
        actual[row][col]=actual[row-1][col];
        actual[row+1][col]=temp;
        actual[row-1][col]=0;
        tems=converArretoString(actual);
        //cout<<tems<<endl;
        if(!stack.search(tems))
        {
           // cout<<tems<<endl;
            stack.push(tems);
        }
        //original
        temp=actual[row][col];
        actual[row-1][col]=temp;
        actual[row][col]=0;

    }

    if(row==2)
    {
        //mover arriba
        temp=actual[row-1][col];
        actual[row][col]=temp;
        actual[row-1][col]=0;
        tems=converArretoString(actual);
        //cout<<tems<<endl;
        if(!stack.search(tems))
        {
           // cout<<tems<<endl;
            stack.push(tems);
        }
        //original
        temp=actual[row][col];
        actual[row-1][col]=temp;
        actual[row][col]=0;
    }


}

void checkCol(STACK<string> stack, int actual[3][3],int row, int col )
{
    int temp;
    string tems;
    if(col==0)
    {

        //mover derecha
        temp=actual[row][col+1];
        actual[row][col]=temp;
        actual[row][col+1]=0;
            //put the generated child on the queue
        tems=converArretoString(actual);
        //cout<<tems<<endl;
        if(!stack.search(tems))
        {
           //cout<<tems<<endl;
            stack.push(tems);
        }
            //return to the orginal
        temp=actual[row][col];
        actual[row][col+1]=temp;
        actual[row][col]=0;

    }//if
    if(col==1)
    {
        //move right
        temp=actual[row][col+1];
        actual[row][col]=temp;
        actual[row][col+1]=0;
        tems=converArretoString(actual);
        //cout<<tems<<endl;
        if(!stack.search(tems))
        {
            //cout<<tems<<endl;
            stack.push(tems);
        }

        //mover izquierda
        temp=actual[row][col];
        actual[row][col]=actual[row][col-1];
        actual[row][col+1]=temp;
        actual[row][col-1]=0;

        tems=converArretoString(actual);
        //cout<<tems<<endl;
        if(!stack.search(tems))
        {
            //cout<<tems<<endl;
            stack.push(tems);
        }
        //orginal
        temp=actual[row][col];
        actual[row-1][col]=temp;
        actual[row][col]=0;
    }

    if(col==2)
    {

        //mover izquierda
        temp=actual[row][col-1];
        actual[row][col]=temp;
        actual[row][col-1]=0;
        tems=converArretoString(actual);
       // cout<<tems<<endl;
        if(!stack.search(tems))
        {
           //cout<<tems<<endl;
            stack.push(tems);
        }
            //orginal
        temp=actual[row][col];
        actual[row][col-1]=temp;
        actual[row][col]=0;

    }

}

1 个答案:

答案 0 :(得分:0)

如何通过引用传递STACK

根据您的实际代码,converArretoString()crearPosibilidad()checkRow()checkCol()按值接收STACK<std::string>变量。因此,他们会收到函数退出的堆栈副本。

checkRow()checkCol()中,推送值

stack.push(tems);

函数退出推送的值。

我建议以这种方式更改功能签名

string converArretoString(STACK <string> & stack, const string & ac);
void crearPosibilidad(STACK <string> & open,string ac);
void checkRow(STACK <string> & stack, int actual[3][3],int row,int col);
void checkCol(STACK <string> & stack, int actual[3][3],int row,int col);

其他建议(与您的问题无关):在可能的情况下,通过const引用传递您的变量。示例:您的checkFoud()按副本收到2 std::string;函数不会修改值,因此您可以通过const引用传递字符串,避免使用无用的副本;

之类的东西
bool checkFound (const string & meta, const string & aVer)
 { return aVer == meta; }

p.s:抱歉我的英语不好。