我们核验深度是否等于棋盘格子数,若等于,则说明我们找到了所求路径,若不等于,说明我们找的这条路径是不对的,这时我们需要将当前节点重置为未搜索的节点,然后回溯到前一节点,并对前一节点的下一个子节点(即下一个可以巡逻的格子)进行DFS。
void dfs(int i, int j); int dx[8] = {-1 , 1, -2, 2, -2 , 2, -1, 1}; int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2}; int marked[MAX][MAX]; //标记 int pathx[MAX]; int pathy[MAX]; int flag, step; int p,q; int main(void) { int n; int i = 0; ...
所以这个题要用到的回溯思想,如果不重复走一遍就走完了,做一个标记,算法停止;否则在某种DFS下走到某一步时按马跳的规则无路可走而棋盘还有为走到的点,这样我们就需要撤消这一步,进而尝试其他的路线(当然其他的路线也可能导致撤销),而所谓撤销这一步就是在递归深搜返回时重置该点,以便在当前路线走一遍行不通...
visited[nx][ny]&&!success){visited[nx][ny]=true;DFS(nx,ny,num+1);visited[nx][ny]=false;// 跑完要回溯 //撤销该步}}}/*31 12 34 3*//*Scenario #1:A1Scenario #2:impossibleScenario
top--; //回溯 因为每次一条路走到底,所以回来要讲下标减一 } } vis[x][y] = false; } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
很典型的dfs。搜的时候就按照字典序从小到大的顺序。搜到第一条路径时停止搜索输出路经就好了。感觉dfs很机智。WA了几次都是因为保存答案那里没有回溯。。。一开始还以为没搞清楚行和列哪个是用字母表示的...T_T ...读题很难的... A Knight's Journey #include...
{ if(flag)return; vis[x][y]=1; mp[step].x=x; mp[step].y=y; if(step==p*q&&flag==0) { flag=1; printf("Scenario #%d:\n",t); for(inti=1;i<=step;i++) { charc=mp[i].x-1+'A'; cout<<c<<mp[i].y; }
POJ 2488 A Knight's Journey解题报告(回溯算法) 题目来源:POJ 2488 A Knight's Journey http://acm.pku.edu.cn/JudgeOnline/problem?id=2488 解法类型:回溯算法 作者:刘亚宁 题目大意:给出一个棋盘的大小,判断马能否不重复的走过所有格,并记录下其中一种走法。
POJ 2488 A Knight's Journey (回溯法 | DFS) 题目链接:http://poj.org/problem?id=2488 题意: 在国际象棋的题盘上有一个骑士,骑士只能走“日”,即站在某一个位置,它可以往周围八个满足条件的格子上跳跃,现在给你一个p * q的矩形格子,让你找一个跳跃顺序(起点自选),使得这个顺序恰好经过矩阵的每一...
所以这个题要用到的回溯思想,如果不重复走一遍就走完了,做一个标记,算法停止;否则在某种DFS下走到某一步时按马跳的规则无路可走而棋盘还有为走到的点,这样我们就需要撤消这一步,进而尝试其他的路线(当然其他的路线也可能导致撤销),而所谓撤销这一步就是在递归深搜返回时重置该点,以便在当前路线走一遍行不通...