中国象棋跳马

 

 

 这道题呢需要方向数组跟别的差不多所以我就只写注意事项:

  dfs函数ans++的条件是k==n*m不是像其他题一样k>n*m.

  主函数中初始点的vis要等于1.

  vis需要初始化.

 程序:

#include<bits/stdc++.h>
using namespace std;
int ans=0,n,m,vis[19][19]={0},d[10][10]={{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
void dfs(int k,int x,int y)
{
    if(k==n*m)
    {
        ans++;
    }
    else
    {
        for(int i=0;i<8;++i)
        {
            int nx=x+d[i][0],ny=y+d[i][1];
            if(vis[nx][ny]==0&&nx<n&&ny<m&&nx>=0&&ny>=0)
            {
                vis[nx][ny]=1;
                dfs(k+1,nx,ny);
                vis[nx][ny]=0;
            }
        }
    }
}
int main()
{
    int t1;
    cin>>t1;
    for(int i=1;i<=t1;i++)
    {
        int x1,y1;
        memset(vis,0,sizeof(vis));
        cin>>n>>m>>x1>>y1;
        vis[x1][y1]=1;
        dfs(1,x1,y1);
        cout<<ans<<endl;
        ans=0;
    }
    return 0;
}

 

posted @ 2022-03-23 20:58  王浩泽  阅读(48)  评论(0编辑  收藏  举报