ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

马走日,简单搜索

2020-02-04 18:02:22  阅读:253  来源: 互联网

标签:sy sx const int cnt 搜索 马走 简单 include


要做一个有心人——王晓燕

由于肺炎疫情的爆发,假期去学校机房上课的计划泡汤了

可是王主任早就给我们列好了计划 传统艺能

然后他就给我们整了一大堆题,其中就包含非常简单的搜索题

于是就有了这道简单的题目:

【题目描述】
马在中国象棋以日字形规则移动。

请编写一段程序,给定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

这道题思路比较简单

从起点开始按日字格走,当步数等于n*m的时候,就代表着遍历了一次,那么答案加一

于是就有了下面的代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int dx[]={0,1,1,2,2,-1,-1,-2,-2};
const int dy[]={0,2,-2,1,-1,2,-2,1,-1};
int t,ans=0,n,m,sx,sy;
bool vis[101][101];
void dfs(int x,int y,int cnt){
    if(cnt==n*m)ans++;
    else{
    for(int i=1;i<=8;++i){
        int tx=x+dx[i];
        int ty=y+dy[i];
        if(x>=0&&x<n&&y>=0&&y<m&&vis[tx][ty]==false){
            vis[tx][ty]=1;
            dfs(tx,ty,cnt+1);
            vis[tx][ty]=0;
        }
    }
    }
}
int main()
{
    cin>>t;
    for(int i=1;i<=t;++i){
        cin>>n>>m>>sx>>sy;
        dfs(sx,sy,1);
        cout<<ans<<endl;
        ans=0;
    }
    system("pause");
    return 0;
}

OK!编译运行,把样例复制上去,按下Enter,然后RE

!?RE,哪里出了问题?

通过仔细观察我们发现(jzh大佬说不能用肉眼看),在判断是否出界时候应该要用移动后的坐标tx,ty

打标也不太对,应当在当前坐标点处打标

这才有了真正的AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int dx[]={0,1,1,2,2,-1,-1,-2,-2};
const int dy[]={0,2,-2,1,-1,2,-2,1,-1};
int t,ans=0,n,m,sx,sy;
bool vis[101][101];
void dfs(int x,int y,int cnt){
    if(cnt==n*m)ans++;
    else{
    for(int i=1;i<=8;++i){
        int tx=x+dx[i];
        int ty=y+dy[i];
        if(tx>=0&&tx<n&&ty>=0&&ty<m&&vis[tx][ty]==false){
            vis[x][y]=1;
            dfs(tx,ty,cnt+1);
            vis[x][y]=0;
        }
    }
    }
}
int main()
{
    cin>>t;
    for(int i=1;i<=t;++i){
        cin>>n>>m>>sx>>sy;
        dfs(sx,sy,1);
        cout<<ans<<endl;
        ans=0;
    }
    system("pause");
    return 0;
}

这个故事告诉我们,要做一个有心人。不然就会和别人产生差距,是必定AK不了IOI的....

标签:sy,sx,const,int,cnt,搜索,马走,简单,include
来源: https://www.cnblogs.com/Wuhen-GSL/p/12260233.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有