求一个遍历算法 如图,有一8*8的方格,要求从任一点出发,到达不同色的另一个随机格。 要求:1.必须经过所有的64格; 2.每个方格只能经过一次。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 边标记: X方向: X11...X99 Y方向: Y11...Y99二维数组 XY[1..9][1..9]移动: X 或者 Y 方向加或者减1 如果无法通过 X 或者 Y 方向加减一到达下一个未标记点,且已经标记数少于64,则失败 #include <stdio.h> #define N 100 #define n 6 int main() { int dx[8],dy[8]; dx[0]= 2 , dy[0]= -1 ; dx[1]= 1 , dy[1]= -2 ; dx[2]= -1 , dy[2]= -2 ; dx[3]= -2 , dy[3]= -1 ; dx[4]= -2 , dy[4]= 1 ; dx[5]= -1 , dy[5]= 2 ; dx[6]= 1 , dy[6]= 2 ; dx[7]= 2 , dy[7]= 1 ; printf("********************\n"); for(int e=0;e<n;e++) for(int r=0;r<n;r++) { int flag[N][N]={0}; int x[N],y[N],log[N]={0}; int beginx=e,beginy=r; flag[beginx][beginy]=1; int stepx=beginx,stepy=beginy; x[0]=beginx,y[0]=beginy; int t=1; int sum=1; while(t>0) { while(1) { if(log[t]==8) { log[t]=0; goto L1; } stepx=stepx+dx[log[t]]; stepy=stepy+dy[log[t]]; if(stepx>=n||stepy>=n||stepx<0||stepy<0) { stepx-=dx[log[t]]; stepy-=dy[log[t]]; log[t]++; goto L0; } if(flag[stepx][stepy]==1) { stepx-=dx[log[t]]; stepy-=dy[log[t]]; log[t]++; } if(flag[stepx][stepy]==0) { flag[stepx][stepy]=1; sum++; x[t]=stepx; y[t]=stepy; break; } L0:; } if(sum==n*n) goto write; t++; goto L2; L1: //flag[x[t]][y[t]]=0; t--; flag[x[t]][y[t]]=0; sum--; stepx=stepx-dx[log[t]]; stepy=stepy-dy[log[t]]; log[t]++; L2:; } goto out; write: printf("\nbeginx=%d,beginy=%d\n",e,r); out:; } return 0; } 是说先考虑对于颜色相同的两个格子A和B,以A为起点B为终点进行全遍历吗?呵呵这是不可能做到的。因为整个棋盘中红色和绿色的格子数量是相等的,而且每一步只能从红色跳到绿色,或者从绿色跳到红色,所以,如果一条路径以红色开头红色结尾的话,整个路径中红色格子就会比绿色格子多一个,这就说明要么棋盘中某一个绿色格子没有走到,要么有某一个红色格子走了不止一遍。同样的,也不可能出现由绿色开头绿色结尾的遍历路径。 是说先考虑对于颜色相同的两个格子A和B,以A为起点B为终点进行全遍历吗?呵呵这是不可能做到的。因为整个棋盘中红色和绿色的格子数量是相等的,而且每一步只能从红色跳到绿色,或者从绿色跳到红色,所以,如果一条路径以红色开头红色结尾的话,整个路径中红色格子就会比绿色格子多一个,这就说明要么棋盘中某一个绿色格子没有走到,要么有某一个红色格子走了不止一遍。同样的,也不可能出现由绿色开头绿色结尾的遍历路径。只要把最后的不同色格定在最后的同色格旁边就可以了。 四个问题,欢迎来看看(广告之后,马上回来) 听说DELPHI写的程序可以百分之百被反编译? 使用TXMLDocument读取XML节点内容时出现一个问题。谢谢 刚学DLL,请指教 关于ehlib3.6一个非常非常有用的功能实现需要帮助(图) 100分求《Delphi 5开发人员指南》 急--在线等待 关于删除注册表信息问题 怎样才可以把JPG文件中的图片LOAD进一个CANVAS? 求object pascal 的語法測試題跟delphi測試題跟答案 请问websocket该如何建立与连接? delphi 怎么得到窗体上最上层是哪个控件? 随机BringToFront,最后得到哪个在最上层
X方向: X11...X99
Y方向: Y11...Y99二维数组 XY[1..9][1..9]移动: X 或者 Y 方向加或者减1 如果无法通过 X 或者 Y 方向加减一到达下一个未标记点,且已经标记数少于64,则失败
#define N 100
#define n 6
int main()
{
int dx[8],dy[8];
dx[0]= 2 , dy[0]= -1 ;
dx[1]= 1 , dy[1]= -2 ;
dx[2]= -1 , dy[2]= -2 ;
dx[3]= -2 , dy[3]= -1 ;
dx[4]= -2 , dy[4]= 1 ;
dx[5]= -1 , dy[5]= 2 ;
dx[6]= 1 , dy[6]= 2 ;
dx[7]= 2 , dy[7]= 1 ;
printf("********************\n");
for(int e=0;e<n;e++)
for(int r=0;r<n;r++)
{
int flag[N][N]={0};
int x[N],y[N],log[N]={0};
int beginx=e,beginy=r;
flag[beginx][beginy]=1;
int stepx=beginx,stepy=beginy;
x[0]=beginx,y[0]=beginy;
int t=1;
int sum=1;
while(t>0)
{
while(1)
{
if(log[t]==8)
{
log[t]=0;
goto L1;
}
stepx=stepx+dx[log[t]];
stepy=stepy+dy[log[t]];
if(stepx>=n||stepy>=n||stepx<0||stepy<0)
{
stepx-=dx[log[t]];
stepy-=dy[log[t]];
log[t]++;
goto L0;
}
if(flag[stepx][stepy]==1)
{
stepx-=dx[log[t]];
stepy-=dy[log[t]];
log[t]++;
}
if(flag[stepx][stepy]==0)
{
flag[stepx][stepy]=1;
sum++;
x[t]=stepx;
y[t]=stepy;
break;
}
L0:;
}
if(sum==n*n) goto write;
t++;
goto L2;
L1:
//flag[x[t]][y[t]]=0;
t--;
flag[x[t]][y[t]]=0;
sum--;
stepx=stepx-dx[log[t]];
stepy=stepy-dy[log[t]];
log[t]++;
L2:;
}
goto out;
write:
printf("\nbeginx=%d,beginy=%d\n",e,r);
out:;
}
return 0;
}
因为整个棋盘中红色和绿色的格子数量是相等的,而且每一步只能从红色跳到绿色,或者从绿色跳到红色,所以,如果一条路径以红色开头红色结尾的话,整个路径中红色格子就会比绿色格子多一个,这就说明要么棋盘中某一个绿色格子没有走到,要么有某一个红色格子走了不止一遍。同样的,也不可能出现由绿色开头绿色结尾的遍历路径。
因为整个棋盘中红色和绿色的格子数量是相等的,而且每一步只能从红色跳到绿色,或者从绿色跳到红色,所以,如果一条路径以红色开头红色结尾的话,整个路径中红色格子就会比绿色格子多一个,这就说明要么棋盘中某一个绿色格子没有走到,要么有某一个红色格子走了不止一遍。同样的,也不可能出现由绿色开头绿色结尾的遍历路径。
只要把最后的不同色格定在最后的同色格旁边就可以了。