栈的应用--马踏棋盘-DFS搜索
2017-10-21 12:11
148 查看
问题描述:将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。走遍棋盘上全部64个方格。编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。
实现思路:DFS 搜索(因为我们的马要踏遍所有的方格,所以我们在这里不需要visted数组,因为如果我们要判断是否走过的话,完全就可以用棋盘是否等于零来判断,同时也提高了一丢丢效率)
实现代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #define ROW 8 #define COL 8 int integer[ROW][COL] ; int print(int integer[ROW][COL]); int dir[8][2]={ {1,2},{2,1}, {2,-1},{1,-2}, {-1,-2},{-2,-1}, {-2,1},{-1,2} } ; //方向数组,代表 8 个方向 int check(int x,int y) { if(x< 0 || y<0 || x>= ROW || y>= COL || integer[x][y] != 0 ) //不是0 ,就不能走了 return 0; return 1; } int dfs(int x,int y ,int step_num) //已经踏到了 x , y ,即x,y 可踏 { int xx,yy ,i ; if(step_num == 65 ) //思考一下为什么是65 ?当下面step_num == 63赋值完成后时,step_num === 64 进入dfs ,遇到if 终止程序了,故64并没有被赋值 { print(integer); exit(1); } for(i= 0;i< 8 ;i++) // 8 个方向 { xx = x + dir[i][0]; yy = y + dir[i][1]; if(check(xx,yy)) //xx ,yy 可踏上去 { integer[xx][yy]=step_num; dfs(xx,yy,step_num+1) ; //DFS 易错点 integer[xx][yy]= 0; //回朔 } } return 0; } int print(int integer[ROW][COL]) { int i,j; for(i=0;i<ROW ;i++) { for(j=0 ;j<COL ;j++) { printf("%6d",integer[i][j]); } printf("\n\n"); } } int main(void) { int i,j ; memset(integer,0,sizeof(integer)); integer[0][0]= 1; dfs(0,0,2) ; }
运行截图:
PS :从(0,0)点出发很快,但从其他任何一个点出发都极其的慢,可能得需要几天吧。So,效率可以说是非常的低下了,必须得想其他的办法才行!!
相关文章推荐
- 【搜索-DFS】POJ1321-棋盘问题
- 深度搜索dfs——百炼08:棋盘问题
- POJ - 1321 棋盘问题(15.10.10 搜索专题)dfs
- [kuangbin]专题一 简单搜索 A - 棋盘问题(dfs 回溯)
- POJ 1321-棋盘问题 简单搜索DFS
- 棋盘问题+POJ+dfs搜索题
- 搜索 D - 棋盘问题(dfs)
- POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)
- 暑期第一弹<搜索> A - 棋盘问题(简单dfs)
- POJ 1321-棋盘问题-简单搜索DFS
- POJ 1321棋盘问题(简单搜索dfs回溯)
- 【搜索】棋盘问题(DFS)
- 棋盘问题 BNUOJ 1440<转>搜索概览 dfs 算法思想实例
- poj 1321 棋盘问题 dfs搜索
- DFS (深度搜索) 简单应用 ---- 分解因子
- POJ 1321-棋盘问题 简单搜索DFS
- 2067 小兔的棋盘【dp】【记忆化搜索dfs】
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
- 深度优先搜索DFS例题--棋盘问题题解(参考写的)
- 深度优先搜索DFS/广度优先搜索BFS的一个应用实例(华为编程大赛赛题)