4123:马走日(dfs)
- 总时间限制:
- 1000ms
- 内存限制:
- 1024kB
- 描述
-
马在中国象棋以日字形规则移动。
请编写一段程序,给定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
1 #include <bits/stdc++.h> 2 using namespace std; 3 int visit[20][20]; 4 int ans,sum; 5 int t,x,y,n,m; 6 int dr[8]={-1,-2,-2,-1,1,2,2,1}; 7 int dc[8]={-2,-1,1,2,2,1,-1,-2}; 8 void dfs(int i,int j){ 9 if(sum==m*n){ 10 ans++; 11 return; 12 } 13 else{ 14 for(int k=0;k<8;k++){ 15 int rr=i+dr[k]; 16 int cc=j+dc[k]; 17 if(visit[rr][cc]==0&&rr>=0&&cc>=0&&rr<n&&cc<m){ 18 visit[rr][cc]=1; 19 sum++; 20 dfs(rr,cc); 21 sum--; 22 visit[rr][cc]=0; 23 } 24 } 25 26 } 27 } 28 29 int main() { 30 31 cin>>t; 32 while(t--) { 33 ans=0; 34 sum=1; 35 cin>>n>>m>>x>>y; 36 memset(visit,0,sizeof(visit)); 37 visit[x][y]=1; 38 dfs(x,y); 39 cout<<ans<<endl; 40 } 41 42 return 0; 43 }
越努力越幸运