1335: 【作】【基础】卒的遍历
内存限制:16 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:6
解决:4
题目描述
在一张n*m的棋盘上(如6行7列)的最左上角(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);
}