上午
写了马的遍历
题目描述
有一个 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