【无标题】1月9日学习总结--搜索

上午

写了马的遍历

题目描述

有一个 n×m 的棋盘,在某个点 (x, y)上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 n,m,x,y。

输出格式

一个n×m 的矩阵,代表马到达某个点最少要走几步(左对齐,宽 5 格,不能到达则输出−1)。

解题思路:先确定马走日的八钟走法,利用dfs找到能走的点,并将走到对应点所需的步数存入对应数组中,和后面到达该点所需步数进行比较,用小的步数替换原有步数,遍历完后打印所有点对应步数。

#include<iostream>
#include<cstring>
using namespace std;
int x,y,n,m;
int a[405][405]= {0},vis[405][405]= {0},b[405][405];
void dfs(int x,int y,int step)
{
    int next[8][2]= {{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};//马能移动的八种路径
    int nx,ny;
    int i;
    for(i=0; i<8; i++)
    {
        nx=x+next[i][0];
        ny=y+next[i][1];
        if(nx>=0&&nx<n&&ny>=0&&ny<m)
        {
            if(a[nx][ny]==0&&vis[nx][ny]==0)
            {
                step=step+1;           
                vis[nx][ny]=1;//标记走过路径               
                 if(b[nx][ny]<0||b[nx][ny]>step)
                    b[nx][ny]=step;//打印最小步数        
                dfs(nx,ny,step);//递归
                vis[nx][ny]=0;//取消标记
                step--;
            }
        }
    }
    return ;
}
int main()
{
    int i,j;
    scanf("%d%d%d%d",&n,&m,&x,&y);
    memset(b,-1,sizeof (b));//调用memset函数将b数组中的值全部初始话为-1
    dfs(x-1,y-1,0);  
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            if(i==x-1&&j==y-1)
                printf("0    ");//将起始位置几位0
            else
                printf("%-5.d",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

改代码能运行出一定数据范围内的结果,超出范围会时间超限,暂未想出解决办法。

直到memset函数只能全部初始化为0或-1
               

下午

写了数字的拆分

解题思路:将数字a从i=1开始拆分,当1不能拆分了时,就将i自加,每拆分出一个数字,将该数存入数组中并用a减去它,当a==0时,依次打印出存入数组中的数。

写这题时,不清楚递归函数的具体运行的顺序,导致结果和预期出现偏差,补题无果

看了有关bfs的视频,里面用到了入队和出队的一些函数,看不太懂

晚上

数字的拆分终于解决了

明日计划

*继续学习bfs

*学习链表

*刷洛谷和juacm

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值