赞
踩
中国象棋半张棋盘如图(a)所示。马自左下角往右上角跳。今规定只许往右跳,不许往左跳,且要求马跳的方式按照(b)图顺时针深度优先递归。比如图(a)中所示为一种跳行路线。如果马要从0,0点,跳到4,8点,前6种跳法的打印格式如下,请参考前6种跳的方式,输出马从0,0点到4,8点所有可能的跳的路线。
1:0,0->2,1->4,2->3,4->4,6->2,7->4,8
2:0,0->2,1->4,2->3,4->1,5->3,6->4,8
3:0,0->2,1->4,2->3,4->1,5->2,7->4,8
4:0,0->2,1->4,2->2,3->4,4->3,6->4,8
5:0,0->2,1->4,2->2,3->4,4->2,5->4,6->2,7->4,8
6:0,0->2,1->4,2->2,3->4,4->2,5->0,6->2,7->4,8
...
无
按要求输出路径
- #include <stdio.h>
- #include <math.h>
- #include <algorithm>
- #include <iostream>
- #include <string.h>
- #include <queue>
- #include <stack>
- #include <map>
- #include <set>
- #include <vector>
- using namespace std;
- int n,m,ans=0,vis[15][15];
- int dx[4]= {2,1,-1,-2},dy[4]= {1,2,2,1};
- struct te {
- int dx;
- int dy;
- };
- te a[20];
- void dfs(int x,int y,int step) {
- if(x==4&&y==8) {
- a[step].dx=x;
- a[step].dy=y;
- ans++;
- cout<<ans<<":"<<a[0].dx<<","<<a[0].dy;
- for(int i=1; i<=step; i++) {
- cout<<"->"<<a[i].dx<<","<<a[i].dy;
- }
- cout<<endl;
- }
- vis[x][y]=1;
- a[step].dx=x;
- a[step].dy=y;
- for(int i=0; i<4; i++) {
- int tx=x+dx[i],ty=y+dy[i];
- if(tx>=0&&ty>=0&&tx<=4&&ty<=8&&vis[tx][ty]==0) {
- step++;
- dfs(tx,ty,step);
- vis[tx][ty]=0;
- step--;
- }
- }
- }
- int main() {
- // scanf("%d%d",&n,&m);
- dfs(0,0,0);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。