马的遍历问题

来源:互联网 发布:淘宝用户画像分析 编辑:程序博客网 时间:2024/04/29 23:35
#include<stdio.h>/*问题描述:在n*m的棋盘上,马只能走日字。马从(x,y)出发,把棋盘的每一个点都走一遍,且只走一次,找出所有路径。*/void find(int x,int y,int dep);int check(int x,int y);void output();int n=5,m=4;int fx[8]={1,2,2,1,-1,-2,-2,-1};int fy[8]={2,1,-1,-2,-2,-1,1,2};int a[5][4];int dep,x,y,count;int main(){int i,j;    dep=1;////记录递归深度,即走过的点的个数,当dep=n*m,找到一组解count=0;printf("Please input the original point:\n");scanf("%d%d",&x,&y);if(x<0 || x>4 || y<0 || y>3){printf("wrong data!\n");return 1;}for(i=0;i<n;i++){for(j=0;j<m;j++){a[i][j]=0;}}a[x][y]=1;find(x,y,2);if(count==0){printf("NO solution!\n");}else{printf("Total count=%d\n",count);}return 0;}void find(int x,int y,int dep){int i;int xx,yy;for(i=0;i<8;i++)//加上方向增量,形成新的坐标{xx=x+fx[i];yy=y+fy[i];if(check(xx,yy)==1)//判断坐标是否出界,或者已经走过{a[xx][yy]=dep;//走向新的坐标if(dep==n*m){output();}else{find(xx,yy,dep+1);//从新的坐标出发,递归下一层}a[xx][yy]=0;//回溯,恢复未走标志}}}int check(int x,int y){int flag = 1;if(x<0 || x>4 || y<0 || y>3){flag = 0;}if(a[x][y]!=0){flag=0;}return flag;}void output(){count++;printf("\ncount=%d\n",count);int i,j;for(i=0;i<n;i++){for(j=0;j<m;j++){printf("%4d",a[i][j]);}printf("\n");}}


 

原创粉丝点击