算法竞赛入门经典第二版课后习题 3-5 谜题
自己写了写代码,功能实现了但是有点小瑕疵,如果输入了非法指令,这段程序会不执行打印错误信息并且不执行非法指令之后的部分,但是非法指令之前的正确指令依然会被执行,这个有点不符合题意了。
小菜鸟一个,效率什么的就先不考虑啦~
还没有上网看别人写的代码,向大佬学习完再来补充~
emmm100多行,感觉自己好菜鸡
上网看了看别人写的代码,生成空格的方式跟我不太一样,我还是更喜欢我自己的嘿嘿,
不过还是有了点启发,做了一些改进,一个是空格在边缘移动时如果在最右端会移动到最左端,其他情况以此类推,这样的话代码就更多啦,好无奈
希望自己能不断进步,以后再回来把它改的好一点吧
# include <iostream>
# include <cstdlib>
# include <ctime>
# include <cstring>
# include <iomanip>
using namespace std;
const int MAX = 100;
int main()
{
char Map[5][5];
memset(Map,'\0',sizeof(Map));
//26个英文字母
char En[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//随机产生空格子的坐标(x,y)
srand(time(0));
int x = rand()%5;
int y = rand()%5;
//生成初始方格
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(i == x && j ==y)
continue;
else
{
int m = rand()%26;
while(En[m] == '\0')
{
m = rand()%26;
}
Map[i][j] = En[m];
En[m] = '\0';
}
}
}
//打印初始方格
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
cout<<setw(3)<<Map[i][j];
cout<<endl;
}
//录入命令
cout<<"输入A、B、L、R使空格上下左右移动,以0为结束符: ";
char s[MAX];
memset(s,'0',sizeof(s));
char n;
for(int i = 0; i < MAX; i++)
{
cin>>n;
if(n == '0')
break;
else
s[i] = n;
}
bool isright = true;
char t;
for(int i = 0; i < MAX; i++)
{
if(s[i] != '0')
{
switch(s[i])
{
case 'A':
//up();
if(x!=0)
{
t = Map[x-1][y];
Map[x-1][y] = '\0';
Map[x][y] = t;
x--;
}
else
{
t = Map[4][y];
Map[4][y] = '\0';
Map[x][y] = t;
x = 4;
}
break;
case 'B':
//down();
if(x!=4)
{
t = Map[x+1][y];
Map[x+1][y] = '\0';
Map[x][y] = t;
x++;
}
else
{
t = Map[0][y];
Map[0][y] = '\0';
Map[x][y] = t;
x = 0;
}
break;
case 'L':
//left();
if(y!=0)
{
t = Map[x][y-1];
Map[x][y-1] = '\0';
Map[x][y] = t;
y--;
}
else
{
t = Map[x][4];
Map[x][4] = '\0';
Map[x][y] = t;
y = 4;
}
break;
case 'R':
//right();
if(y!=4)
{
t = Map[x][y+1];
Map[x][y+1] = '\0';
Map[x][y] = t;
y++;
}
else
{
t = Map[x][0];
Map[x][0] = '\0';
Map[x][y] = t;
y = 0;
}
break;
default:
cout<<"This puzzle has no final configuration.\n";
isright = false;
break;
}
}
if(isright == false)
break;
}
//打印命令执行之后的方格
if(isright == true)
{
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
cout<<setw(3)<<Map[i][j];
cout<<endl;
}
}
return 0;
}