搜索_复习

太久没有做过搜索相关的题目,基本的代码实现都要忘记了,作为复习吧,分别用栈来模拟深搜,队列来模拟广搜,借助于递归(系统栈)来模拟搜索三种方法来求解问题。作为一个ACMer,一题多解是最基本的素质!


题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=465


题目代码实现:

#include <iostream>
#include <cstdio>
#include <cstring>

#include <queue>
#include <stack>

using namespace std;

struct node
{
    int x,y;
};

stack<node>sta;   ///用栈来模拟搜索

int n;
char str[15][15];
int dx[5]= {-1,1,0,0};
int dy[5]= {0,0,-1,1};
int ans;

int solve(int st,int sd)
{
    node temp;
    temp.x=st;
    temp.y=sd;
    sta.push(temp);
    str[temp.x][temp.y]='#';///在入栈的时候就要
    while(!sta.empty())
    {
        node now;
        now=sta.top();
        sta.pop();

        int nx,ny;
        for(int i=0; i<4; i++)
        {
            nx=now.x+dx[i];
            ny=now.y+dy[i];
            if(nx>=0 && nx<n && ny>=0 && ny<n && str[nx][ny]=='.')
            {
                ans++;
                node tmp;
                tmp.x=nx;
                tmp.y=ny;
                //cout<<nx<<"   "<<ny<< "  "<<ans<<endl;
                //cout<<str[nx][ny]<<endl;
                sta.push(tmp);
                str[tmp.x][tmp.y]='#';
            }
        }
    }
    return ans;
}

queue<node>que;  ///用队列来模拟搜索
int solve1(int sx,int sy)
{
    int nx,ny;
    node temp;
    temp.x=sx;
    temp.y=sy;
    que.push(temp);

    while(!que.empty())
    {
        node now;
        now=que.front();
        que.pop();

        for(int i=0;i<4;i++)
        {
            nx=now.x+dx[i];
            ny=now.y+dy[i];
            if(nx>=0 && nx<n && ny>=0 && ny<n && str[nx][ny]=='.')
            {
                ans++;
                node tmp;
                tmp.x=nx;
                tmp.y=ny;
                que.push(tmp);
                str[tmp.x][tmp.y]='#';
            }
        }
    }
    return ans;
}


void solve2(int sx,int sy)
{
    int nx,ny;
    for(int i=0;i<4;i++)
    {
        nx=sx+dx[i];
        ny=sy+dy[i];
        if(nx>=0 && nx<n && ny>=0 && ny<n && str[nx][ny]=='.')
        {
            ans++;
            solve2(nx,ny);
        }
    }
}



int main()
{
    //int sum;
    while(scanf("%d",&n)!=EOF)
    {
       //sum=0;
        ans=0;
        memset(str,0,sizeof(str));
        for(int i=0; i<n; i++)
        {
            for(int j=0;j<n;j++)
            {
                scanf(" %c",&str[i][j]);
            }
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(str[i][j]=='@')
                {
                    solve1(i,j);
                    break;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
算法导论是计算机科学中非常重要的一门课程,它涵盖了计算机算法的设计、分析与应用。期末复习是为了加深对所学知识的理解和掌握,为考试做好充分准备。 使用Python语言进行算法导论的复习是一种很好的选择。Python是一种强大且易于上手的编程语言,具有简洁的语法和丰富的库支持。下面是几个复习的重点: 1. 熟悉Python的基本语法和数据结构:掌握Python的基本数据类型如列表、字典和集合,并了解它们的操作与性能。 2. 掌握常见排序算法:复习插入排序、归并排序、快速排序等常见的排序算法,并能够灵活应用它们解决实际问题。 3. 熟悉图算法:学习图的表示方法,以及广度优先搜索(BFS)和深度优先搜索(DFS)等基本的图算法。 4. 熟练应用动态规划算法:了解动态规划的基本思想,复习使用动态规划解决背包问题、最长公共子序列等典型问题。 5. 学习贪心算法:了解贪心算法的概念和特点,熟悉使用贪心算法解决活动选择、哈夫曼编码等问题。 6. 熟练掌握分治算法:复习分治算法的基本思想和应用,熟悉使用分治算法解决最大子数组和矩阵乘法等问题。 7. 复习基本的算法分析方法:熟悉时间复杂度和空间复杂度的概念,掌握算法的渐进分析方法。 在复习过程中,可以通过参考教材、课堂笔记和习题集等资料进行练习和巩固所学知识。此外,可以参考一些算法导论的相关网上资源和在线教育平台上的课程进行深入学习。最重要的是,要坚持刷题,多进行实际编码练习,巩固所学算法的理解和应用能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值