马踏棋盘

来源:互联网 发布:网络d是什么意思 编辑:程序博客网 时间:2024/04/30 22:47
#include<stdio.h>#include<time.h>#define X 8#define Y 8int chess[X][Y];void print(void);//找到基于(x,y)位置的下一个可走的位置int nextxy(int *x,int *y ,int count){switch(count){case 0:if(*x+2<=X-1&&*y-1>=0&&chess[*x+2][*y-1] == 0){*x += 2;*y -= 1;return 1;}break;case 1:if(*x+2<=X-1&&*y+1<=Y-1&&chess[*x+2][*y+1] == 0){*x +=2;*y +=1;return 1;}break;case 5:if(*x-2>=0&&*y+1<=Y-1&&chess[*x-2][*y+1] == 0){*x -=2;*y +=1;return 1;}break;case 4:if(*x-2>=0&&*y-1>=0&&chess[*x-2][*y-1] == 0){*x -=2;*y -=1;return 1;}break;case 3:if(*x+1<=X-1&&*y+2<=Y-1&&chess[*x+1][*y+2] == 0){*x +=1;*y +=2;return 1;}break;case 2:if(*x+1<=X-1&&*y-2>=0&&chess[*x+1][*y-2] == 0){*x +=1;*y -=2;return 1;}break;case 7:if(*x-1>=0&&*y+2<=Y-1&&chess[*x-1][*y+2] == 0){*x -=1;*y +=2;return 1;}break;case 6:if(*x-1>=0&&*y-2>=0&&chess[*x-1][*y-2] == 0){*x -=1;*y -=2;return 1;}break;default:break;}return 0;}//深度优先便利棋盘//(x,y)为位置坐标//tag是标记变量,每走一部tag+1int TravelChessBoard(int x,int y,int tag){int x1 = x,y1 = y,flag = 0,count = 0;chess[x][y] = tag;if(X*Y == tag){//打印棋盘print();return 1;}//找到马的下一个可走的坐标(x1,y1)如果找到flag = 1,否则为0flag = nextxy(&x1,&y1,count);while(0 == flag&& count<7){count++;flag = nextxy(&x1,&y1,count);}while(flag){if(TravelChessBoard(x1,y1,tag+1)){return 1;}//继续找找到马的下一步可以走的坐标(x1,y1),否则为0x1 = x;y1 = y;count ++;flag = nextxy(&x1,&y1,count);while(0 == flag &&count<7){count++;flag = nextxy(&x1,&y1,count);}}if(0 == flag){chess[x][y] = 0;}return 0;}void print(void){int i,j;for(i = 0;i<X;i++){for(j=0;j<Y;j++){printf("%2d\t",chess[i][j]);}printf("\n");}printf("\n");}int main(){int i,j;clock_t start,finish;start = clock();for(i = 0;i<X;i++){for(j = 0;j<Y;j++){chess[i][j] = 0;}}if(!TravelChessBoard(2,0,1)){printf("sorry fail\n");}finish = clock();printf("time is %f second",(double)(finish-start)/CLOCKS_PER_SEC);return 0;}

0 0
原创粉丝点击