我试图用堆叠来解决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;
}
}
答案 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:抱歉我的英语不好。