很高兴见到你!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/windywo/article/details/47813315

Time Limit:1000MS
Memory Limit:65536KB
64bit IO Format:%I64d & %I64u

Description
定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。

Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

题目大意就是给你一个以1,0为基础的迷宫,0表示可走,1不可走,问从迷宫左上角到右下角的最少路程时走过的坐标。

用总结来说,dfs用来求能否到达目的地以及若能到达路线有多少种比较好,而bfs用来求最短距离比较好,因此看到这道题的时候自然知道要用bfs,但是却不知道该怎么表示走过的坐标,后来知道其实可以再开一个from数组记录一下走在当前位置的前一个位置,,然后对于求到的最短路一步步向前推

当中要注意:
1.搜索的元素是否在迷宫内;
2.是否可行(其中1不能走,0可以走)。
我们可以把已走过的路标记为1,这样能保证路径最短,直到搜索到右下角(4, 4),问题就解决了。输出路径即可

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int u[]={0,1,0,-1};//相当于使其上下左右改变坐标位置
int v[]={1,0,-1,0};
struct stu
{
    int x,y;
    int step;
}from[7][7];//from数组用来保存每个位置的前一步位置的坐标
int w[7][7],map[7][7];
int can(stu a)
{
    if(a.x<0||a.x>=5||a.y<0||a.y>=5||w[a.x][a.y ]||map[a.x][a.y]==1)//某点在迷宫范围内且按此步骤来讲没有经过过
        return 0;
    return 1;
}
void bfs(int x,int y)
{
    queue<stu>q;//优先队列,最先输出小的值
    stu now,next;//now当前位置,next下一个位置
    now.x=x;
    now.y=y;
    now.step=1;
    q.push(now);
    w[x][y]=1;
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        if(now.x==4&&now.y==4)//到达终点
            return ;
        for(int i=0;i<4;i++)
        {
            next.x=now.x+u[i];//改变坐标,移动位置
            next.y=now.y+v[i];
            if(can(next))
            {
                next.step=now.step+1;
                q.push(next);//next符合条件,入队列
                w[next.x][next.y]=1;
                from[next.x][next.y].x=now.x;//记录上一步的坐标
                from[next.x ][next.y ].y=now.y;
            }
        }
    }
}

int main()
{
    int i,j,k,m,n;
    memset(w,0,sizeof(w));//w用来标记某点是否走过
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        scanf("%d",&map[i][j]);//将迷宫输入,用map数组来记录迷宫
    }
    bfs(0,0);//左上角出发,即起点坐标为(0,0)
    i=4,j=4,k=0;//从目的地开始,一步步向前推
    p[k].x=4;
    p[k++].y=4;
    while(i!=0||j!=0)///根据from的记录,从后往前回溯其路径,并存在p中
    {
        m=i;
        n=j;
        i=from[m][n].x;
        j=from[m][n].y;
        p[k].x=i;
        p[k++].y=j;     
    }
    for(i=k-1;i>=0;i--)//逆向输出
        printf("(%d, %d)\n",p[i].x,p[i].y); 
    return 0;
}
bfs邻接表
void bfs(int u)
{
    memset(vis,0,sizeof(vis));
    queue<int>q;
    vis[u]=1;
    q.push(u);
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
            if(!vis[v])
            {
                vis[v]=1;
                q.push(v);
            }
        }
    }
}

邻接表模板
#include<stdio.h>
#include<string.h>
int head[100100],cnt;
struct s
{
    int u,v,w;
    int next;
}edge[100010];
void add(int u,int v,int w)
{
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i;
        cnt=0;
        memset(head,-1,sizeof(head));
        for(i=0;i<n;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        int u;
        scanf("%d",&u);
        for(i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
            int w=edge[i].w;
        }
    }
    return 0;
}
展开阅读全文

高兴见到了五个角,散分

01-15

这段时间比较闲,不经意之间,发现自己有了五个角,很高兴,我很少提问,也很少散分,这次来试试散分的味道:-)rn 这段时间里认识了不少朋友,这里面有这么多技术精英,而且大家都如此坦诚,如此热心的帮助别人,我感到十分高兴。刚才看了CSDN上关于针对侯捷先生的书评,感到了技术人员的犀利和直爽。当然也有许多逻辑需要重新调试一番才应该说出口,但是作为技术人,最大的感觉就是直接的形象和执拗的自信--我也是一样的,说那样就那样,除非能够把我说得心服口服(很难)。而在这个论坛,我觉得十分温馨,没有冰霜和刀光剑影。我喜欢这里。这段时间来,我只是在默默的看着,有自己知道的就帮一下别人,有自己还不知道的,就跟人家学一学,自由、平静却充满着研究的味道。我们这里有许多人从来不问报酬的解答疑惑,他们都是十分高尚的技术精英,值得我敬佩,从他们身上我学到了很多--我也学着关心别人的疑难。rn 在这里,我写一点自己在ASP中遇到的问题:在写ASP之前,并没有做很好的规划,喜欢直接使用Response.Write 以及 <%=...%>的方式直接把信息送到输出端而没有进行任何转换,例如rn rn1、 rnrn2、 > rnrn3、rnrn 最后成了产品却发现这种习惯导致了一个非常严重的问题:没有充分考虑各种特殊字符,有时会导致程序失效。后来要修改这种失效,我是硬着头皮使用UltraEdit查找了整整五万行的ASP代码,修改了近千处,把这种表示方法全部得以纠正。劝大家以我为戒。rn 其实解决问题的方法很简单:rn rn 提供一个公用函数rn<%rnfunction Escape(s)rn dim ssrn ss = Replace(s, "&", "\u0026")rn ss = Replace(ss, "\", "\u005C")rn ss = Replace(ss, "'", "\u0027")rn ss = Replace(ss, """", "\u0022")rn ss = Replace(ss, vbCr, "\u000D")rn ss = Replace(ss, vbLf, "\u000A")rn Escape = ssrnend functionrn%>rnrn以上修改成了:rnrn1、 rnrn2、 > (这种写法应该杜绝)rnrn3、rnrnrn 希望大家也罗列一些类似经验,相互提高。rn rn 论坛

嵌入式,很高兴认识你

10-30

打算写点我自己认识“嵌入式”的过程,从一开始的听说,到学习,到找工作...rn我:就读杭州电子科技大学,软件工程专业,现在大四。事情是这样的:大一做了很多兼职,服务员,话务员,促销员...大二马上也要结束了,开始思考自己以后的方向,要做什么,也许有人会说你喜欢什么就做什么呗,我会告诉你我想开淘宝店吗,哈哈,这点也导致我大四的一个冲动的决定,后面再说,继续。那时开始在网上搜索软件工程专业可以从事那些工作,无意中看到嵌入式,门槛高,待遇高,我眼前突然一亮,稍微了解了下后,除了要买板子什么可能要费点钱外,别的都没问题,钱,省省总是有的,不是还有奖学金吗,哈哈。就这样,开始决定学习嵌入式了。rn 虽然决定学习嵌入式了,了解了后发现这东西挺难学的,接着就是各种培训机构,要不要去呢,要不要去呢,去你*妹的去啊,你有钱吗,我连学费都是贷款的,15000的培训费,我去抢啊,哈哈,知道自己不可能去培训,但还是查了很多关于培训的情况,有华清远见,尚观,杭州还有华嵌,达内等等等等,最后得出的结论就是,假如你要去培训,就一定要亲自去看看,至少看两家以上,收集他们的授课情况,授课顺序,开发环境,硬件设施,然后就是,一般培训机构都有试听的,不用交钱,不听白不听是吧,试听那日子里再多打听打听,比如学长们在哪里培训的怎么样,出去后都去哪了?但,不管是培训还是自学,关键都是人。废话又多了...,然后...然后就是开始自学了。rn 自学嵌入式,又是在网上不停的搜:“如何自学嵌入式”“嵌入式自学过程”等等,哈哈。看来看去看到头大,到底要怎么学啊,只知道要有C语言的基础,然后呢?然后呢?接着不知道怎么就找到了个帖子,叫什么专科生学嵌入式XXX,具体忘记了,也就是一个专业生买了套视频学习嵌入式然后找到工作的过程吧,虽然有打广告的嫌疑,但当时的我真的信了,去了解了下那套视频,500+rmb,我眼珠都要掉出来了,最后考虑再三,还是买了,为了学嵌入式豁出去了,奖学金的大半就这样没了,我就不具体说什么视频,等你把这帖子看完,我会把这套视频送给你,信不信由你。rn 视频质量还好,应付我这还没入门的菜鸟足够了,这视频就是把所有网上的嵌入式视频进行剪辑合并整理,虽然杂七杂八的,主要是国嵌的视频,但还是很系统的,从c语言到linux到移植到驱动开发,很多人问我这视频效果怎么样?我都会说,入门不错,能让你知道要学哪些怎么写,对于初学者不至于那么迷茫。rn 买到视频后没马上开始看,期末考来了,开始各种抱佛脚。考完试后就抱着视频回家看,整整看了我一暑假,本文没打算告诉你参数是放在堆中还是栈中,也不会说怎么移植bootload,只是想聊聊关于自学嵌入式的过程和心得,具体的学习方法那就是:视频+书+google+论坛。rn 视频看的云里雾里的,因为干速度,把所有视频一口气在暑假都看完了,乃至肚子里没什么积淀下来,但我大概知道自己需要哪些知识了,一linux编程,二arm。开学后我就先后买了两本书,一本《unix环境高级编程》,一本《arn体系结构与编程》,这一学期,很多专业课,除了应付考试,我全部的时间都花在这两本书上了,而且unix环境高级编程看完了一遍,真不容易啊,arn体系结构与编程看了至少两本,才看懂一点点,汗死。。。这学期就这样了,是不是很慢啊,哈哈rn 寒假来了,我买了51开发板来学习,我没有任何硬件基础,感觉直接接触arm会吃不消,网上的人也都只是说:有51基础最好,没有也没关系。这是什么和什么嘛,500的视频都买了,100多的51板子,勤工俭学多做做就是了,在粗略的看完视频后,就开始学51编程了,有c的基础,又有板子,按照郭天祥的视频来学不就可以了,用了近半个月时间,知道了如何写程序在板子上跑,练习了几个小程序,从点亮led灯开始,哈哈。噼里啪啦,很快开学了,接着呢,想买arm开发板,淘宝了下,最后定了一款,又是500+,然后就是不停的倒腾,对于这一堆的东西都很陌生,哪个是并口啊,这usb转并口又是怎么用的啊,jtag又是啥啊,虽然在看视频时都听说过,但没用过还真不知哪跟哪,哈哈。什么都有第一次嘛,那时就是担心板子被我弄坏,怕会不会突然短路了,烧了,其实这些担心都是多余的。你使劲玩,想怎么玩就怎么玩,大不了最后重新移植bootloader,linux系统,板子都附带了这些的,你只要重新烧进去就可以了,又不用自己剪裁修改。倒腾了近半个月吧,我把板子自带的测试程序看懂了,应该说看了个半懂,哈哈。这一过程让我学会了一点,如何玩板子。接着我又迷茫了,直接开始移植bootloader,linux系统我完全还不会,更不用说写驱动了,那怎么办呢,无意中找到了《嵌入式linux应用开发完全手册》,看了看目录,感觉挺合适我的,他主要是讲如何对板子上每个部分进行编程控制的,我现在有了C,linux基础,也会使用板子了,在这基础上看这本书刚刚好,哈哈,那就开始吧,一章一章的学,遇到很多问题,那就到群里问,论坛上问,google上找。这本书我没看完,大概看到bootloader哪部分我就停下来了,因为又要开始抱佛脚了,也开始为暑假实习找工作了。rn 佛脚抱的很成功,实习面试了好几家,但没进的。。。最后糊里糊涂进了一家做移动设备上游戏开发的,他们还有做很多应用,导游系统什么的。。。我被分配到做儿童游戏的一组,用的是C++,我不会啊,游戏开发,这个嵌入式有个毛关系,但找到一份工作不容易啊,做着先呗。公司和学校每天坐车来回要3小时,一星期后,我的心情越来越糟糕,越来越不想上班,越来越不想看代码,在没得到这家公司的offer前,我都打算好了,假如暑假没有找到实习工作,我就去开淘宝店,因为一直想,呵呵。结果纠结了很久很久,不知道为什么那时又想开淘宝店,但连想卖什么都不知道,纠结纠结,最后在第三个星期的星期一我正式辞职了,打算回学校开淘宝店。戏剧性的一幕发生了,在辞职当天,坐在公司等把辞职流程走完是,接到一个电话,浙江XXXX股份有限公司面试通知,我靠,这可是一家大公司啊,而且是实打实的嵌入式开发好归宿啊,去面面也不会有损失啊,那就去呗,笔试面试再面试,回去等通知,过了个周末周一还没消息,没戏了吧,反正也不抱希望的,继续想想我开淘宝要卖什么吧,可是当我在教室看着淘宝大学的一些视频时,电话来了,我一看,有戏了,也确实,我就这样进入了浙江XXXX股份有限公司,高兴啊,开始找房子搬家,我那时可真是希望在这一直待下去的,听说毕业转正后工资5000+啊,我这三本生,已经很高了,我工作很认真,学习也很卖力,学校需要什么社会实践证明,我去弄时,主管对我的评价还很高,说我是潜力股,我也相信自己是潜力股,哈哈。可是。。。rn 中间我也不知道是什么原因,开始对这种上班生活开始厌烦,不知道什么原因,但我知道不能这么浮躁,要坚持,可是慢慢的我开始没有学习的态度,写日报周报时都不知道这一天一周干了什么。在一个晚上无意中看了《北京青年》,好吧,我疯狂了,看了个通宵。。。第二天怀这莫名的感觉去上班了,我知道现在这样的生活方式不是我想要的,那我想要什么样的呢?我他-妈到底想怎么样,我开始讨厌自己,我他-妈到底怎么了。后来,不知道怎么回事,销售这两个字进入我的脑海,我开始疯狂的对自己是,我要做销售,我要做销售,但我还是在克制自己,知道现在这份工作很难得。结果呢,还是辞职了,现在的打算就是在学校做毕业设计,做完后开始找销售类的工作,但做什么行业呢,我也不清楚,我这专业不对口,又没经验的人能找到销售类的工作已经很不错了,暂时定在电子半导体和it行业吧,呵呵。rn 写着写着好像写偏了,哈哈,大家随便看看吧,希望能对刚开始学习嵌入式的同学有帮助,能解除你们一点点的迷茫也好,因为我现在就很迷茫,迷茫实在太可怕了,哈哈,但我现在至少知道自己要往哪走。rnrn我学嵌入式看的书籍:rn《嵌入式linux应用开发详解》rn《unix环境高级编程》rn《arm体系结构与编程》rn《嵌入式linux应用开发完全手册》rn《linux内核设计与实现》rn《linux设备驱动程序》几乎没看rn《linux那些事儿之我是USB》还没看过,哈哈rnrn我的qq:375824701,欢迎交流,共享有嵌入式学习视频rnrn希望大家多多拍砖,我现在真的很欠揍,哈哈 论坛

没有更多推荐了,返回首页