测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A34374. 路线

填空题 困难

题目描述

路线

题目描述

小蓝将多盆鲜花摆成一个M*N的矩阵,小蓝每天都会从左上角位置的花盆出发,给每一个花盆中的鲜花浇水。

已知:

1)每两个相邻的花盆之间的距离都相等;

2)每次小蓝浇水的路线都是走直线,不能走斜线;

3)除左上角花盆以外,其他花盆只能经过一次;

4)每盆花都浇过之后返回左上角位置。

当给出M和N的值,请你帮助小蓝找出一共有多少条路线可以满足以上条件,如果没有满足条件的路线输出0。

例如:M=3,N=4,一共有4条路线满足以上条件。

输入描述

输入两个正整数M,N(2≤M≤10,2≤N≤10),M表示矩阵的行数,N表示矩阵的列数,两个正整数之间以一个空格隔开

输出描述

输出一个整数,表示一共有多少条路线可以满足以上条件,如果没有满足条件的路线输出0

样例输入

3 4

样例输出

4

参考答案

// 参考代码1 #include <bits/stdc++.h> #define N 11 using namespace std; int a[N][N]; int n, m, ans; int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; bool st[N][N]; void dfs(int x, int y, int step) { // cout << x << ' ' << y << ' ' << step << endl; for (int i = 0; i < 4; i++) { int xx = x + dx[i]; int yy = y + dy[i]; if (!st[xx][yy] && 1 <= xx && xx <= n && 1 <= yy && yy <= m) { st[xx][yy] = 1; if (step + 1 == n * m) { if (xx == 1 && yy == 1) ans++; st[xx][yy] = 0; return; } dfs(xx, yy, step + 1); st[xx][yy] = 0; } } } int main() { scanf("%d%d", &n, &m); if (n % 2 == 1 && m % 2 == 1) { cout << "0" << endl; return 0; } dfs(1, 1, 0); cout << ans << endl; return 0; }

答案解析

// 参考代码2

#include <bits/stdc++.h>

using namespace std;


int n, m, ans;

int v[15][15];

int d[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};


void dfs(int x, int y, int step) {

  // cout << x << " " << y << "\n";

if (x == 1 && y == 1 && step == n * m) {

    ans++;

    return;

  }

  if (v[x][y])

    return;

  v[x][y] = 1;

  for (int i = 0; i < 4; i++) {

    int xx = d[i][0] + x;

    int yy = d[i][1] + y;

if (xx > 0 && xx <= n && yy > 0 && yy <= m) {

      dfs(xx, yy, step + 1);

    }

  }

  v[x][y] = 0;

}


int main() {

  cin >> n >> m;

if (n % 2 == 1 && m % 2 == 1) {

    cout << 0;

    return 0;

  }

  dfs(1, 1, 0);

  cout << ans;

  return 0;

}

上一题 下一题