2016-05-10 80 views
-1

我試圖解決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=""; 
    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

不知道您正在使用的'STACK'功能的實施情況,無法分辨它的行爲。然而,假設'stack.push()'已知可以工作,那麼我建議考慮在什麼情況下'!stack.search(tems)'是錯誤的,以及如果你的'if(row)'和'if col)'類型檢查正在發生,因爲你也想要它們。 – Jameson

+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; } 

對不起,因爲我的英語不好。

+0

感謝它解決了。我仍然不明白如何和工作。但是謝謝你。 p.s dont擔心我的甚至是最糟糕的 – Abe

相關問題