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

A26680. 马走日

填空题 困难

题目描述

马走日

题目描述

马在中国象棋以日字形规则移动。

请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

输入

第一行为整数T(T < 10),表示测试数据组数。

每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。

输出

每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。

输入样例

1
5 4 0 0

输出样例

32

参考答案

#include <bits/stdc++.h> using namespace std; int n, m, ct;//棋盘为n行m列, ct:遍历方法计数 bool vis[10][10];//vis[i][j]:(i,j)位置是否已访问 int dir[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}}; //从(sx,sy)开始搜索。r:还剩多少位置未遍历 void dfs(int sx, int sy, int r) { if(r == 0)//如果每个位置都遍历完 { ct++;//遍历整个棋盘的路线数加1 return; } for(int i = 0; i < 8; ++i)//遍历8个可以从(sx,sy)出发走日到达的位置 { int x = sx + dir[i][0], y = sy + dir[i][1]; if(x >= 0 && x < n && y >= 0 && y < m && vis[x][y] == false) {//如果(x,y)在棋盘内,且没访问过 vis[x][y] = true;//访问该位置 dfs(x, y, r-1);//搜索(x,y)位置,剩余未访问的位置数量减1 vis[x][y] = false;//状态还原 } } } int main() { int t, x, y; cin >> t; while(t--) { cin >> n >> m >> x >> y; ct = 0;//多组数据,注意数据清零 memset(vis, 0, sizeof(vis)); vis[x][y] = true;//访问起始位置 dfs(x, y, n*m-1);//剩下n*m-1个未访问的位置 cout << ct << endl; } return 0; }
上一题 下一题