1335: 【作】【基础】卒的遍历

内存限制:16 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:6 解决:4

题目描述

在一张n*m的棋盘上(如67列)的最左上角(1,1)的位置有一个卒。

该卒只能向下或者向右走,且卒采取的策略是先向下,下边走到头就向右,请问从(1,1)点走到(n,m)点可以怎样走,输出这些走法。

输入

两个整数n,m代表棋盘大小(3=<n<=8,3<=m<=8)

输出

卒的行走路线

样例输入 复制

3 3

样例输出 复制

1:1,1->2,1->3,1->3,2->3,3
2:1,1->2,1->2,2->3,2->3,3
3:1,1->2,1->2,2->2,3->3,3
4:1,1->1,2->2,2->3,2->3,3
5:1,1->1,2->2,2->2,3->3,3
6:1,1->1,2->1,3->2,3->3,3

提示

#include <bits/stdc++.h>
using namespace std;
//路径总数和路径
int a[100][100],t=0;                 
 //两种移动规则 
int dx[2]={1,0},dy[2]={0,1};
int n,m;
//输出结果 
void print(int s)
{
    t++;
    cout<<t<<":";
	for(int i=1;i<s;i++){
		cout<<a[i][1]<<","<<a[i][2]<<"->";	
	}
	cout<<n<<","<<m<<endl;
}
//递归回溯 
void dfs(int k)
{
	//往2个方向走
	for (int i=0;i<2;i++){ 
		int tx=a[k-1][1]+dx[i],ty=a[k-1][2]+dy[i];
		//判断马不越界
		if (tx>=0&&tx<=n&&ty>=0&&ty<=m){
		     //保存当前卒的位置
			a[k][1]=tx;                              
			a[k][2]=ty;
			if (tx==n&&ty==m){
				print(k);
			}else{
				//搜索下一步	
				dfs(k+1);
			} 
		}
	} 
}
int main(){
	cin>>n>>m;
	a[1][1]=1;
	a[1][2]=1;
	//从坐标(0,0)开始往右跳第二步
	dfs(2); 
}