| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1077 人关注过本帖
标题:汉诺塔运行时出现一个错误
只看楼主 加入收藏
chuishuitao
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-5-25
收藏
 问题点数:0 回复次数:13 
汉诺塔运行时出现一个错误

请版主帮我修改谢谢 要改到看到塔的效果
#include <iostream.h>
#include <vector>
#include <windows.h>
using namespace std;

//-----------函数声明--------------
void Instruct();
void display(int row);
void OtoTw(int n,int row);
void OtoTh(int n,int row);
void ThtoO(int n,int row);
void ThtoTw(int n,int row);
void TwtoTh(int n,int row);
void TwtoO(int n,int row);

vector < vector<string> > sArr;
static int one,two,three;//分别记录3个柱子上的盘子数量
int main()
{
//定义一个字符串类型的容器
vector<string>s(10);
s[0]=" _ ";
s[1]=" ___ ";
s[2]=" _____ ";
s[3]=" _______ ";
s[4]=" _________ ";
s[5]=" ___________ ";
s[6]=" _____________ ";
s[7]=" _______________ ";
s[8]=" _________________ ";
s[9]=" ___________________ ";
string space=" ";
//-------------用户界面开始-----------
Instruct();bool b=1;
int row; //用户选择排数
char choice; //用户选择是否继续
do
{
do
{
cout<<"输入汉佑塔的行数:";
cin>>row;
if(row<0||row>10){cout<<"***Error***!\n Out of range! Input again!\n";continue;}
sArr.resize(row);
//-------------初始化汉罗塔----------
//将第3个柱子设置为全部满,第1和2为空(space定义的那样)
for(int i=0;i<row;i++)
{
sArr[i].resize(3);
sArr[i][0]=s[i];
sArr[i][1]=space;
sArr[i][2]=space;

}
one=row;two=0;three=0;
}while(row<0||row>10);

/*因为是递归函数,所以首先返回的肯定是最深层的内容。这样结实够清楚了吧?*/
display(row);
//cout<<sArr[0][1];
OtoTh(row,row);
cout<<"Go again or exit?\n"
"Press any key to come again(y to quit):";
cin>>choice;if(choice=='y'||choice=='Y')b=0;
}while (b);
system("pause");
return 0;
}
//游戏说明
void Instruct()
{
cout<<"*_*_*_*_*_Instruction_*_*_*_*_*_*\n"
"This is an old game being palyed by many years "
"which named HanLuoTa ! \n"
"You should just inputed a number to determine how "
"many rows the HanLuoTa have!\n\n"
"***GAME BEGIN***\n";
}
void display(int row)
//-----输出汉偌塔目前情景-----
{
Sleep(1000);
system("cls");
for(int i=0;i<row;i++)
{
for(int j=0;j<3;j++)
{cout<<sArr[i][j];}
cout<<endl;
}
}


//row->总层数 n->转移几层
void OtoTh(int n,int row)
//1->3:将第1个柱子上的盘移动n个到第3个上
{
//--------如果移动的排数递归到不是1个盘,执行下面操作---------
if(n!=1)
{
//-----先将n-1个盘从第1个柱子移到第2个柱子上(怎么实现呢?继续下面的递归)
OtoTw(n-1,row);
//-----再将第n个盘(最下面的盘)移动到第3个柱子上
sArr[row-one][0].swap(sArr[row-three-1][2]);//这就是一个字符串交换的过程。
one--;three++;
display(row);
//再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
TwtoTh(n-1,row);
//显示现在情景
}
//--------如果移动的排数递归到只剩1个盘,执行下面操作(直接移动到目标盘上)---------
else
{
sArr[row-one][0].swap(sArr[row-three-1][2]);
one--;three++;
display(row);
}
}
void OtoTw(int n,int row)
//1->2:将第1个柱子上的盘移动n个到第2个上
{
if(n!=1)
{
//-----先将n-1个盘从第1个柱子移到第3个柱子上(怎么实现呢?继续下面的递归)
OtoTh(n-1,row);
//-----再将第n个盘(最下面的盘)移动到第2个柱子上
sArr[row-one][0].swap(sArr[row-two-1][1]);
one--;two++;
display(row);
//再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
ThtoTw(n-1,row);
}
else
{
sArr[row-one][0].swap(sArr[row-two-1][1]);
one--;two++;
//显示现在情景
display(row);
}

}
//---------下面的跟上面的解释差不多,整体上是一个递归函数--------
void ThtoO(int n,int row)
//3->1
{
if(n!=1)
{
ThtoTw(n-1,row);
sArr[row-three][2].swap(sArr[row-one-1][0]);
one++;three--;
display(row);
TwtoO(n-1,row);
}
else
{
sArr[row-three][2].swap(sArr[row-one-1][0]);
three--;one++;
display(row);
}
}
void ThtoTw(int n,int row)
//3->2
{
if(n!=1)
{
ThtoO(n-1,row);
sArr[row-three][2].swap(sArr[row-two-1][1]);
three--;two++;
display(row);
OtoTw(n-1,row);
}
else
{
sArr[row-three][2].swap(sArr[row-two-1][1]);
three--;two++;
display(row);
}
}


void TwtoTh(int n,int row)
//2->3
{
//---------解释同上-------------
if(n!=1)
{
TwtoO(n-1,row);
sArr[row-two][1].swap(sArr[row-three-1][2]);
three++;two--;
display(row);
OtoTh(n-1,row);
}
else
{
sArr[row-two][1].swap(sArr[row-three-1][2]);
three++;two--;
display(row);
}
}
void TwtoO(int n,int row) //2->1
{
if(n!=1)
{
TwtoTh(n-1,row);
sArr[row-two][1].swap(sArr[row-one-1][0]);
one++;two--;
display(row);
ThtoO(n-1,row);
}
else
{
sArr[row-two][1].swap(sArr[row-one-1][0]);
two--;one++;
display(row);
}

}

搜索更多相关主题的帖子: int 汉诺塔 void row windows 
2006-05-26 13:54
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
这是我的程序啊?哪里有错误?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-26 14:29
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
你用的VC吧?你在程序最上面加一个
#pragma warning(disable: 4786)
#include "stdafx.h"

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-26 14:31
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

我把我的演示代码已经发到群里了,你可以去看看
我现在可以运行的代码是:
#include <iostream>
#include <vector>
#include <windows.h>
using namespace std;

//-----------函数声明--------------
void Instruct();
void display(int row);
void OtoTw(int n,int row);
void OtoTh(int n,int row);
void ThtoO(int n,int row);
void ThtoTw(int n,int row);
void TwtoTh(int n,int row);
void TwtoO(int n,int row);

vector < vector<string> > sArr;
static int one,two,three;
static int step;
int main()
{
//定义一个字符串类型的容器
vector<string>s(10);
s[0]=" _ ";
s[1]=" ___ ";
s[2]=" _____ ";
s[3]=" _______ ";
s[4]=" _________ ";
s[5]=" ___________ ";
s[6]=" _____________ ";
s[7]=" _______________ ";
s[8]=" _________________ ";
s[9]=" ___________________ ";
string space=" ";
//-------------用户界面开始-----------
Instruct();bool b=1;
int row; //用户选择排数
char choice; //用户选择是否继续
do
{
do
{
cout<<"Input the number of HanLuoTa's row:";
cin>>row;
if(row<0||row>10){cout<<"***Error***!\n Out of range! Input again!\n";continue;}
sArr.resize(row);
//-------------初始化汉罗塔----------
//将第3个柱子设置为全部满,第1和2为空(space定义的那样)
for(int i=0;i<row;i++)
{
sArr[i].resize(3);
sArr[i][0]=s[i];
sArr[i][1]=space;
sArr[i][2]=space;

}
one=row;two=0;three=0;
}while(row<0||row>10);
step=0;
/*因为是递归函数,所以首先返回的肯定是最深层的内容。这样结实够清楚了吧?*/
display(row);
//cout<<sArr[0][1];
OtoTh(row,row);
cout<<"Go again or exit?\n"
"Press any key to come again(y to quit):";
cin>>choice;if(choice=='y'||choice=='Y')b=0;
}while (b);
system("pause");
return 0;
}
//游戏说明
void Instruct()
{
cout<<"*_*_*_*_*_Instruction_*_*_*_*_*_*\n"
"This is an old game being palyed by many years "
"which named HanLuoTa ! \n"
"You should just inputed a number to determine how "
"many rows the HanLuoTa have!\n\n"
"***GAME BEGIN***\n";
}
void display(int row)
//-----输出汉偌塔目前情景-----
{
Sleep(1000);
system("cls");
for(int i=0;i<row;i++)
{
for(int j=0;j<3;j++)
{cout<<sArr[i][j];}
cout<<endl;
}
cout<<"It takes the step: "<<step<<endl;
step++;
//if(kbhit())break;
}


//row->总层数 n->转移几层
void OtoTh(int n,int row)
//1->3:将第1个柱子上的盘移动n个到第3个上
{
//--------如果移动的排数递归到不是1个盘,执行下面操作---------
if(n!=1)
{
//-----先将n-1个盘从第1个柱子移到第2个柱子上(怎么实现呢?继续下面的递归)
OtoTw(n-1,row);
//-----再将第n个盘(最下面的盘)移动到第3个柱子上
sArr[row-one][0].swap(sArr[row-three-1][2]);//这就是一个字符串交换的过程。
one--;three++;
display(row);
//再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
TwtoTh(n-1,row);
//显示现在情景
}
//--------如果移动的排数递归到只剩1个盘,执行下面操作(直接移动到目标盘上)---------
else
{
sArr[row-one][0].swap(sArr[row-three-1][2]);
one--;three++;
display(row);
}
}
void OtoTw(int n,int row)
//1->2:将第1个柱子上的盘移动n个到第2个上
{
if(n!=1)
{
//-----先将n-1个盘从第1个柱子移到第3个柱子上(怎么实现呢?继续下面的递归)
OtoTh(n-1,row);
//-----再将第n个盘(最下面的盘)移动到第2个柱子上
sArr[row-one][0].swap(sArr[row-two-1][1]);
one--;two++;
display(row);
//再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
ThtoTw(n-1,row);
}
else
{
sArr[row-one][0].swap(sArr[row-two-1][1]);
one--;two++;
//显示现在情景
display(row);
}

}
//---------下面的跟上面的解释差不多,整体上是一个递归函数--------
void ThtoO(int n,int row)
//3->1
{
if(n!=1)
{
ThtoTw(n-1,row);
sArr[row-three][2].swap(sArr[row-one-1][0]);
one++;three--;
display(row);
TwtoO(n-1,row);
}
else
{
sArr[row-three][2].swap(sArr[row-one-1][0]);
three--;one++;
display(row);
}
}
void ThtoTw(int n,int row)
//3->2
{
if(n!=1)
{
ThtoO(n-1,row);
sArr[row-three][2].swap(sArr[row-two-1][1]);
three--;two++;
display(row);
OtoTw(n-1,row);
}
else
{
sArr[row-three][2].swap(sArr[row-two-1][1]);
three--;two++;
display(row);
}
}


void TwtoTh(int n,int row)
//2->3
{
//---------解释同上-------------
if(n!=1)
{
TwtoO(n-1,row);
sArr[row-two][1].swap(sArr[row-three-1][2]);
three++;two--;
display(row);
OtoTh(n-1,row);
}
else
{
sArr[row-two][1].swap(sArr[row-three-1][2]);
three++;two--;
display(row);
}
}
void TwtoO(int n,int row) //2->1
{
if(n!=1)
{
TwtoTh(n-1,row);
sArr[row-two][1].swap(sArr[row-one-1][0]);
one++;two--;
display(row);
ThtoO(n-1,row);
}
else
{
sArr[row-two][1].swap(sArr[row-one-1][0]);
two--;one++;
display(row);
}

}
在VC上编译出现问题,有朋友指点说,在最上面加上我先前说的两句话就OK了


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-26 20:52
ooooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2005-6-24
收藏
得分:0 
程序警告了什么?
为什么要用#pragma warning(disable: 4786)强行去除警告

2006-05-26 21:12
chuishuitao
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-5-25
收藏
得分:0 

我用的是VC,它说cout<<sArr[i][j];}这里有个错了,<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)
Error executing cl.exe.

2006-05-28 15:15
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
#include "stdafx.h"
加一句这

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-28 17:55
chuishuitao
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-5-25
收藏
得分:0 

版本用VC加#include "stdafx.h"这句还是运行不了啊

2006-05-29 21:41
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
你在加个包含语句,我先前看漏了

#pragma warning(disable: 4786)
#include<string>

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-31 15:22
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
#include "stdafx.h"这个不用加

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-31 15:23
快速回复:汉诺塔运行时出现一个错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014311 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved