1、题目大意:找从起点到终点的最短路步数;【迷宫类】
深搜!(这还是第一次完全自己写出来的,阶段性的一点进步)
#include <bits/stdc++.h>
using namespace std;
int a[50][50],book[50][50],n,m,zx,zy,min1=999999;
int fx[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void dfs(int x,int y,int step)
{
if(x==zx&&y==zy)
{
if(step<min1)
min1=step;
cout<<x<<" "<<y<<endl;
return ;
}
int tx=x,ty=y;
for(int i=0;i<=3;i++)
{
tx=x+fx[i][0],ty=y+fx[i][1];
if(x<1||x>n||y<1||y>m)
continue;
if(book[tx][ty]==0&&a[tx][ty]==0)
{
book[tx][ty]=1;
dfs(tx,ty,step+1);
book[tx][ty]=0;
}
}
return;
}
int main()
{
//freopen("int.txt",stdin);
int startx,starty;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];//0表示空地,1表示障碍物;
cin>>startx>>starty>>zx>>zy;
book[startx][starty]=1;
dfs(startx,starty,0);
cout<<min1;
getchar();getchar();
return 0;
}
2、[USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins - 洛谷
老经典的题了,也是在从自己写这个题的过程中发现自己的很多问题
首先值得表扬的是,自己的思路和关键步骤都正确(此时耗时1h,不知道为啥,写在纸上以后老是容易断片,忘了这一步要干啥,可能太在意是不是漏了啥细节了),于是迎来了电闪雷鸣,打草稿的时候就模糊细节处怎么实现,果然,又栽了。
深搜的核心,要知道这一步搜索需要做什么(把这一步的所有可能结果考虑完全),和下一步分离!因为步骤是重复的!要保持这一步的独立性!所以第一遍找到了最核心的bug。(然而这还是妥协后发现的,因为照着之前的代码我就寻思一定能通过微调改对程序,但是看到题解后发现之前的行不通,所以dfs()内全重新写)
还没完,那怎么记录答案所选取的饲料种类数和序号?(此前还没想到dfs()括号内要带变量)所以dfs()的括号内放的是,和求解的答案有关,且在所有的搜索过程中都有身影的变量(找找能把这一步和下一步联系起来的变量),在这里找的是正查找到的位置和已选饲料种类数.
这下应该过了吧,结果判断所选饲料是否够数的函数里又带错数组了,不应该计算最终答案的饲料序号,而是临时选择的饲料序号;
综上,这个题才过。历时4小时左右;
其实上学期很多题都没能自己动手写一写,其中很多会漏掉的细节还是需要自己思考才能发现。
其实几天之前我还是按照题单顺序一个个做的,又个别不会的(比方说搜索,dp)就先跳过去了,因为读完题目后发现搜索的具体实现我还是不能靠自己完全写出来,而且dp的状态方程看题解上面的还看不懂,所以想着既然不会的都挺集中的,不如系统的重新学,先搭起来理论地基,再实践,再深入难一点的理论理解,再实践。这样虽然比较慢而且可能会在综合时不能辨题类型,但是我的理论基础还是有很大程度上的欠缺的,望系统学习后可以见题有思路,知道可以用啥解决,可以自己琢磨哪里能改进而不是运行都有问题。
玩的多了也会腻,还没啥收获,还是喜欢充实的生活,起码一天下来知道自己做什么了。