早上
听一个小时的英语四级听力,并记下不熟悉的单词。
开始写洛谷里的”马的遍历“。我知道这样的求最小步数的用bfs最好,可我还是想试一试dfs,于是写了一个上午……
主要问题有:
此题的输出格式有特殊要求,尽管我有注意到,可格式还是出错了,理解错了意思。
我也有犹豫要不要使用回溯,因为我觉得按照这题目的意思好像是可以重复到原来的位置,于是最开始我并没有使用回溯,尽管出现了答案——这代表可以运行出来,不会死循环——可答案错误,最后使用回溯,还是没写出来……用dfs的话,的确麻烦得多……
下午
题目为:
最终得出的代码为:
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
typedef struct node{
int x,y,step;
}node;
int x,y,fx,fy,n,m,vis[401][401],book[401][401],path[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{-1,2},{-1,-2},{1,2},{1,-2}};
int bfs()
{
queue<node> q;
node k;
k.x=x;
k.y=y;
k.step=0;
vis[x][y]=1;
q.push(k);//放入起点坐标
while(!q.empty())//当q队列为空时,代表能到达的点都已判断完,此时可结束
{
node p=q.front();//取出队首
q.pop();//弹出队首
for(int i=0;i<8;i++)//马可以走八个方向
{
int xx=p.x+path[i][0];
int yy=p.y+path[i][1];
if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]==1)//若马走去的坐标超出棋盘范围或已经走过则重新走
continue;
node u;//此时坐标满足条件
u.x=xx;
u.y=yy;
u.step=p.step+1;
vis[xx][yy]=1;//标记此地已经走过
book[xx][yy]=p.step+1;//已经走到此点,而此时的步数一定为最小步数,则将此步数填入地图中
q.push(u);//将满足条件的路径坐标存入队列
}
}
}
int main()
{
scanf("%d %d %d %d",&n,&m,&x,&y);
bfs();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(book[i][j]==0&&!(i==x&&j==y))//我在这里取了个巧,我在bfs里把能走到的地方都赋值了最小步数,而还剩下不能走到
//的没有处理,于是我在输出时特判值为0的,若它的坐标跟起始位置相同则正常输出0,若不同
//则就是不能达到的点
printf("%-5d",-1);
else
printf("%-5d",book[i][j]);
printf("\n");
}
}
尽管我使用了bfs且可得出正确答案,可测试的时候有四个案例时间超限了……于是在寻找了一下帮助的情况下,成功更改,并每个案例的测试运行时间在4ms一下。
时间超限的原因在于我之前使用的打图方式是在主函数中使用两个for循环,这两个循环代表着图的下标位置,于是每一个下标我都设置它为目标地址,并使用bfs寻找到达这个点的最小步数。如果使用这种方法,一旦数目开始大起来,就一定会时间超限。
具体描述在代码的注释中有详细介绍。
尝试写”P1135 奇怪的电梯“,得20,还在努力中……
晚上
继续听英语四级听力,并记录陌生单词。
看B站宋浩老师的高数教学视频,并在买的高数练习册上写了一些题目。
期间尝试写”P1135 奇怪的电梯“,没写出来……
尝试写”P2392 kkksc03考前临时抱佛脚“,没写出来……
明日目标
把上面那些尝试做的题目给我写出来啊啊啊啊啊啊啊啊啊,气死了啊啊啊啊啊啊啊
持续学高数和英语,对了,增加一项,还有记单词,对,记英语四级单词。nice!