It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center。
我的代码在这里:问题是在8*8棋盘中找到从一个棋盘到另一个棋盘的最小移动次数。
#include<iostream>
using namespace std;
int n;
int a[12][12];
int min1=1000,xd=5,yd=2,ys,xs,xsi,ysi;
int find_path(int xs,int ys)
{
cout<<xs<<" "<<ys<<endl;
if((xs==xd) && (ys==yd)) { cout<<"destiny schieved "<<endl; return 0;}
if(a[xs][ys]==1 || xs<0 || ys<0 || xs>7 || ys>7) return 10000;
a[xs][ys]=1;
int a1=1+(find_path(xs-2,ys+1)) ;
int b=1+(find_path(xs-2,ys-1)) ;
int c=1+(find_path(xs-1,ys+2)) ;
int d=1+(find_path(xs-1,ys-2)) ;
int d=1+(find_path(xs+2,ys+1)) ;
int e=1+(find_path(xs+2,ys-1)) ;
int f=1+(find_path(xs+1,ys+2)) ;
int g=1+(find_path(xs+1,ys-2)) ;
a[xs][ys]=0;
return min(a1,b,c,d,e,f,g);
}
int main()
{
int i,j,k;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
a[i][j]=0;
cout<<"start"<<endl;
cout<<find_path(0,7);
system("pause");
return 0;
}
这是我在8*8棋盘上从一个方格到另一个方格的代码。
我的代码在某些情况下给出了错误的答案:
[xs][ys]=1;用于防止循环。
例如,(0,7)>>>>(5,2)的答案是4,但我的算法给出了38。我的坐标轴是x:从左到右和Y轴:从上到下。请帮我解决我的问题。
很少有解决方案是:
(7,0)—>>>(0,7):6个
(0,7)>>>(5,2):4个
我还尝试了另一个代码,后来我对其进行了编辑以获得上述代码:
int find_path(int xs,int ys,int path)
{
cout<<xs<<" "<<ys<<endl;
if((xs==xd) && (ys==yd)) { if(min1>path) min1=path; cout<<"destiny schieved "<<path<<endl; return 1;}
if(a[xs][ys]==1 || xs<0 || ys<0 || xs>7 || ys>7) return 0;
a[xs][ys]=1;
if(find_path(xs-2,ys+1,path+1)) {if(path==0) {cout<<"i am on start1"<<endl;} else return 1;}
if(find_path(xs-2,ys-1,path+1)) {if(path==0) {cout<<"i am on start2"<<endl;} else return 1; }
if(find_path(xs-1,ys+2,path+1)) {if(path==0) {cout<<"i am on start3"<<endl;} else return 1; }
if(find_path(xs-1,ys-2,path+1)) {if(path==0) {cout<<"i am on start4"<<endl;} else return 1;}
if(find_path(xs+2,ys+1,path+1)) {if(path==0) {cout<<"i am on start5"<<endl;} else return 1;}
if(find_path(xs+2,ys-1,path+1)) {if(path==0) {cout<<"i am on start6"<<endl;} else return 1;}
if(find_path(xs+1,ys+2,path+1)) {if(path==0) {cout<<"i am on start7"<<endl;} else return 1; }
if(find_path(xs+1,ys-2,path+1)) {if(path==0) {cout<<"i am on start8"<<endl;} else return 1; }
a[xs][ys]=0;
return 0;
}
最佳答案
从数据结构的角度思考而不是从算法的角度思考往往是有益的。
在这种情况下,骑士在棋盘上的有效移动构成无向图G,其中顶点表示棋盘位置,边表示有效移动因此,节点a1和b3可能通过边连接,因为骑士可以从a1移动到b3,反之亦然。
考虑到问题的这种表示,计算骑士从a到b的最小移动次数是相当容易的,因为它是g中从节点a到节点b的最短路径的长度。
为了计算给定的起始节点和所有端节点的最短路径,使用具有时间复杂度O(V v e)的Belman Ford算法。
为了计算所有结点对的最短路径,使用具有时间复杂度O(Ⅴ^ ^ 3)的弗洛依德WARWRE算法。
关于algorithm - 骑士电影最短[已关闭],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13871302/
10-11 23:46