九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲

转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/40718149

简单说说宽度优先搜索BFS

说实话,这是第一个自己写的宽度优先搜索的题目,之前也是不太明白之间的区别,好吧,只能说自己学的太渣……

言归正传,对于初学者来说,可能最大的概念就是一个是深度搜索,一个是宽度搜索,好吧,我表示废话了,我其实就是这个样子的,然后一直不得甚解。。。所以第一次上来,我就直接搜索DFS,结果太明显,就是TLE或者MLE,然后就抓狂中,这可能是很多初学者在开始的时候犯的错误了。

我个人的感觉宽度搜索和深度搜索都是很暴力的枚举,但是区别呢,还是比较明显的,就比如下面这两题来说,基本上的都是一样,通过题目的描述,都是最快找到,在深度优先搜索中就是要找到所有能到达的最短路径了,所以,其实应该说都能够找到的,只是花费的时间不一样而已。

总结起来就是以下几点:

1:宽度优先搜索的用意一般都会比较明显,比如最小啊,就是有比较限制的时候,比较多的时候会用宽度优先,这个,可以用一个比喻来说,就是从一个点,滴墨水,看谁先到,这就是宽度,每做一步,墨水都会扩散,然后得到新的起始点,继续扩散,一个循环的过程。

2:深度优先的话,用于枚举多少类型的时候会比较多,很常见的应用就是8皇后,N皇后的问题了

附上两题的题解

题目1365:贝多芬第九交响曲

题目链接地址http://ac.jobdu.com/problem.php?pid=1365

#include <stdio.h>
#include <queue>
#include <memory.h>
using namespace  std;

struct Node
{
    int x, y,step;
};
bool A[101][101];
short testCase[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
int Cal(int x,int y,int ex,int ey,int num)
{
    if(x==ex&&y==ey)
        return 0 ;
    queue <Node> p;
    Node tmp,q;
    int result=0;
    tmp.x=x;
    tmp.y=y;
    tmp.step=0;
    p.push(tmp);
    while(p.size()>0)
    {
        tmp=p.front();
        p.pop();
        for (int i=0;i<8;i++)
        {
            q.x=tmp.x+testCase[i][0];
            q.y=tmp.y+testCase[i][1];
            if(q.x>0&&q.y<=num&&q.x<=num&&q.y>0&&!A[q.x][q.y])
            {
                q.step=tmp.step+1;
                A[q.x][q.y]=true;
                if(q.x==ex&&q.y==ey)
                    return q.step;
                else
                    p.push(q);
            }
        }

    }
    return -1;
}

int main()
{
    int num,x,y,ex,ey;
    //freopen("data.in","r",stdin);
    while(scanf("%d",&num)!=EOF)
    {
        memset(A,0,sizeof(A));
        scanf("%d%d%d%d",&x,&y,&ex,&ey);
        printf("%d\n",Cal(x,y,ex,ey,num));
    }
    return 0;
}
/**************************************************************
    Problem: 1365
    User: vincent_ynh
    Language: C++
    Result: Accepted
    Time:450 ms
    Memory:1064 kb
****************************************************************/

九度 题目1335:闯迷宫

题目链接地址:http://ac.jobdu.com/problem.php?pid=1335

#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
//#define LOCAL
bool A[100][100];
struct Node
{
    int x,y,step;
};

int Cal(int num)
{
    if(num==1)
        return 0;
    Node first,second;
    first.x=0;
    first.y=0;
    first.step=0;
    int testCase[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    queue<Node> result;
    result.push(first);
    while(result.size()>0)
    {
        first=result.front();
        A[first.x][first.y]=true;
        result.pop();
        for (int i=0;i<4;i++)
        {
            second.x=first.x+testCase[i][0];
            second.y=first.y+testCase[i][1];
            second.step=first.step+1;
            if(second.x>=0&&second.y<num&&second.x<num&&second.y>=0&&!A[second.x][second.y])
            {
                A[second.x][second.y]=true;
                if(second.x==num-1&&second.y==num-1)
                    return second.step;
                else
                    result.push(second);
            }

        }
    }
    return -1;
}
int main()
{
    int inf=10000;
#ifdef LOCAL
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
#endif
    int num;
    while(scanf("%d",&num)!=EOF)
    {
        for(int i=0;i<num;i++)
            for(int j=0;j<num;j++)
            {
                scanf("%d",&A[i][j]);
            }
        if(A[0][0]==false&&A[num-1][num-1]==false)
            printf("%d\n",Cal(num));
        else
            printf("-1\n");
    }
    return 0;
}
/**************************************************************
    Problem: 1335
    User: vincent_ynh
    Language: C++
    Result: Accepted
    Time:100 ms
    Memory:1064 kb
****************************************************************/
时间: 2024-10-03 14:02:12

九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲的相关文章

九度oj 题目1365:贝多芬第九交响曲

现在在一块空的场地上会有一个大的二维棋盘,裁判会给你指定初始位置及一座贝多芬雕像所处的位置,你开始时就站在裁判指定的初始位置处,你的目标是跳到贝多芬雕像的位置.为了给比赛增加一定的难度,你在棋盘上行走时,必须按照中国象棋中的马的走步方式来走.玩过中国象棋的人都知道,马走“日”,象走“田”.最后,你只需要告诉裁判最少多少步能到达贝多芬的雕像.如果根本就到不了贝多芬的雕像处,你直接告诉裁判就可以了. 玄影游侠站在棋盘的某一个位置,不知道该如何走,他知道你们都学过程序设计,所以想请你们帮帮忙编一个程序

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

九度oj题目1009:二叉搜索树

题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出:                        如果序列相同则输出YES,否则输出NO 样

九度 Online Judge 之《剑指 Offer》一书相关题目解答

前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus Torvalds 所言“Talk is cheap, show me the code!",详见托管在 Github 的源码:点击打开链接(核心部分有注释). 难度总结:有些可以不必要像书中那样保存中间结果,直接输出,也就可以不使用书中的算法:有些题目在书中题目的基础上加了更多的要求,也更难实现一点.

九度oj 题目1159:坠落的蚂蚁

题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止.如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去.在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动.给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间. 输

九度OJ平台练习(二)—— 题目1001

今天刷的题目是1001,题目用英文给出,但不难解读. 题目的意思是说,输入两个矩阵A和B(二者彼此的行数相同,列数相同),进行矩阵加法得到A+B,统计A+B矩阵中零行和零列的数量. 思路: 首先是计算A+B,这个不难,可以用二维数组实现. 其次是统计零行和零列,先明确概念,零行指的是整个行的每个数都为0的行,零列指的是整个列里的每个数都为0的列.那么我们只须分行和分列对数组进行遍历. 代码如下: C++版本 #include<iostream> #include<stdio.h>

uva 816 - Abbott&#39;s Revenge(有一点难度的bfs迷宫题目)

就是典型的bfs,但这道题目的难点在于其条件的读取和判断并不简单,需要想办法来读取条件,也需要想办法来判断在每个点处能不能满足向下继续走的条件. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<iostream> #include<algorithm> using namespace std; struct note { int