关于骑士巡游问题!大家看看怎么出错的!

jjjabc 2005-04-07 09:53:47
请帮忙测试查错!


#include "stdafx.h"
#include <iostream>
using namespace std;

void move(int id,int &x,int &y);
bool IsUnfoot(int id,int x,int y);
bool IsFinish(int id,int x,int y);
bool IsOut(int i,int row,int column);
int IsArrive(int row,int column);

int horizontal[8];
int vertical[8];
bool close[8][8];//走过的格标为 1
main()
{
horizontal[0] = 2; // 8种移动方式之列
horizontal[1] = 1;
horizontal[2] = -1;
horizontal[3] = -2;
horizontal[4] = -2;
horizontal[5] = -1;
horizontal[6] = 1;
horizontal[7] = 2;

vertical[0] = -1; // 8种移动方式之行
vertical[1] = -2;
vertical[2] = -2;
vertical[3] = -1;
vertical[4] = 1;
vertical[5] = 2;
vertical[6] = 2;
vertical[7] = 1;
//对close赋初值
for (int x=0;x<8;x++)
{
for (int y=0;y<8;y++)
{
close[x][y]=0;
}
}
int row=0,column=1;


IsArrive(row,column);
}
void move(int id,int &x,int &y)
{
if (close[(x+horizontal[id])][y+(vertical[id])]==0&&IsOut(id,x,y))
{
close[(x+horizontal[id])][y+(vertical[id])]=1;
x=(x+horizontal[id]);
y=y+vertical[id];
}
}
bool IsUnfoot(int id,int x,int y)
{
if (close[(x+vertical[id])][y+(horizontal[id])]==0&&IsOut(id,x,y))
return 1;
else
return 0;
}
bool IsFinish(int id,int x,int y)
{
close[(x+vertical[id])][y+(horizontal[id])]=1;
for(int i=0;i<8;i++)
{


for(int j=0;j<8;j++)
{
if (close[i][j]==0)
{
close[(x+vertical[id])][y+(horizontal[id])]=0;
return 0;
}
}
}
close[(x+vertical[id])][y+(horizontal[id])]=0;
return 1;
}
bool IsOut(int i,int row,int column)//是否走出棋盘
{
switch(i)
{
case 0:if (row<6&&column<7)return 1;else return 0;
case 1:if (row<7&&column<6)return 1;else return 0;
case 2:if (row>0&&column<6)return 1;else return 0;
case 3:if (row>1&&column<7)return 1;else return 0;
case 4:if (row>1&&column>0)return 1;else return 0;
case 5:if (row>0&&column>1)return 1;else return 0;
case 6:if (row<7&&column<1)return 1;else return 0;
case 7:if (row<6&&column>0)return 1;else return 0;
}
return 1;
}
int IsArrive(int row,int column)
{
for (int id=0;id<8;id++)
{
if ((IsOut(id,row,column))&&IsUnfoot(id,row,column)&&IsFinish(id,row,column))
{
cout<<"ok";
return id;
}
else
continue;

}

move(IsArrive(row,column),row,column);
return 8;
}
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
llmsn 2005-04-08
  • 打赏
  • 举报
回复
是哪类算法问题来的?
zengwujun 2005-04-08
  • 打赏
  • 举报
回复
你下面的判断全错了
bool IsOut(int i,int row,int column)//是否走出棋盘
{
switch(i)
{
case 0:if (row<6&&column<7)return 1;else return 0;
case 1:if (row<7&&column<6)return 1;else return 0;
case 2:if (row>0&&column<6)return 1;else return 0;
case 3:if (row>1&&column<7)return 1;else return 0;
case 4:if (row>1&&column>0)return 1;else return 0;
case 5:if (row>0&&column>1)return 1;else return 0;
case 6:if (row<7&&column<1)return 1;else return 0;
case 7:if (row<6&&column>0)return 1;else return 0;
}
return 1;
}

应该是这样的
bool IsOut(int i,int row,int column)//是否走出棋盘
{
switch(i)
{
case 0:if (row<6&&column>0)return 1;else return 0;
case 1:if (row<7&&column>1)return 1;else return 0;
case 2:if (row>0&&column>1)return 1;else return 0;
case 3:if (row>1&&column>0)return 1;else return 0;
case 4:if (row>1&&column<7)return 1;else return 0;
case 5:if (row>0&&column<6)return 1;else return 0;
case 6:if (row<7&&column<6)return 1;else return 0;
case 7:if (row<6&&column<7)return 1;else return 0;
}
return 1;
}
zengwujun 2005-04-08
  • 打赏
  • 举报
回复
你这个就是马走日子的程序啊,下面的代码跟你的思路一样

#include <iostream>
#include <memory>
using namespace std;
#define ROW 8
#define COLUMN 8
int a[ROW+1][COLUMN+1];
int b[8][2]={
{1,2},
{1,-2},
{-1,2},
{-1,-2},
{2,1},
{2,-1},
{-2,1},
{-2,-1}
};
bool horse(int x,int y,int n)
{
int i;
if(n==ROW*COLUMN-1)
{
cout<<"最后的点落在"<<x<<"行"<<y<<"列"<<endl;
return true ;
}
a[x][y]=1;
for(i=0;i<8;i++)
{
if((x+b[i][0])<=ROW&&(x+b[i][0])>=0&&(y+b[i][1])<=COLUMN&&(y+b[i][1])>=0)
if(!a[x+b[i][0]][y+b[i][1]])
if(horse(x+b[i][0],y+b[i][1],n+1))
{
cout<<"("<<x<<","<<y<<")"<<endl;
return true;
}
}
return false;

}
int main()
{
int startx,starty,n;
startx=starty=0;
n=0;
memset(a,0,sizeof(a));
if(horse(startx,starty,n))
cout<<"succeed"<<endl;
else
cout<<"false"<<endl;
return 0;
}
pengzuoli 2005-04-08
  • 打赏
  • 举报
回复
up
liujinxing 2005-04-08
  • 打赏
  • 举报
回复
没听过呢
不知道是什么题目
富莱工作室 2005-04-07
  • 打赏
  • 举报
回复
move(IsArrive(row,column),row,column); =========== 问题就在这里,
main()
{
''''''''''''
IsArrive(row,column);------------main里的第一次对它的调用,如果不能返回id

}

到这里由于row,column都没有变,move(IsArrive(row,column),row,column);
IsArrive()永远不返回,



富莱工作室 2005-04-07
  • 打赏
  • 举报
回复
int IsArrive(int row,int column)
{
for (int id=0;id<8;id++)
{
if ((IsOut(id,row,column))&&IsUnfoot(id,row,column)&&IsFinish(id,row,column))
{
cout<<"ok";
return id;
}
else
continue;

}

move(IsArrive(row,column),row,column);-----------------想递归也最好不要这样用吧。
return 8;
}
没有算法过程, 所以看不太明白, 但感觉有问题
pcboyxhy 2005-04-07
  • 打赏
  • 举报
回复
没听说过 骑士巡游问题
chunhai12 2005-04-07
  • 打赏
  • 举报
回复
程序编译通过,不知道有没有逻辑上的错误
chenyec 2005-04-07
  • 打赏
  • 举报
回复
你这样只写程序,怎么知道你在说什么!
把题也写上来,给大家分享分享嘛!

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧