dfs经典例题(故事中的题解)

简介: dfs经典例题(故事中的题解)

       小航如愿以偿,以五百分的成绩,进入了c++佚名者学校。(详见 走进“深度搜索基础训练“,踏入c++算法殿堂(五)_aliyonghang的博客-CSDN博客)现在到了分班考试时间,同学们个个摩拳擦掌,准备考试。

      “叮——”考试开始。

第一道题

题目:

1.迷宫问题 (Standard IO)

时间限制: 1000 ms  空间限制: 262144 KB  具体限制  

题目描述:

image.gif编辑

输入:

第一行输入n,表示n行n列的迷宫

接下来有n行,每行n个数,分别用1或0表示能否通过

输出:

输出路径数

样例输入:

3

0 0 0

0 1 1

1 0 0

样例输出:

2

小航想到(思路):

1.可用搜索的方法来做(一条路走到黑),慢慢的尝试,直到达到终点

2.要用数组记录方法数

3.可以用两个一维或一个二维数组对位置进行变化(上下左右)

4.设立visit数组标记已走过某个点

5.设a数组记录迷宫,当a[x][y]==0时,标记并准备下一步;否则重新选择方向,直到找到或四种方向都已经试过

小航写道(程序):

#include<iostream>
using namespace std;
int n,x1,y1,x2,y2,mi1[10][10],mi2[10][10],bx[9]={0,-1,0,1,-1,1,-1,0,1},by[9]={0,-1,-1,-1,0,0,1,1,1},s;
void dg(int x,int y)
{
  if(x==x2&&y==y2)
  {
    s++;
    return; 
  }
  else
  {
    for(int i=1;i<=8;i++)
    {
      int qx=x+bx[i],qy=y+by[i];
      if(qx>0&&qx<=n&&qy>0&&qy<=n)
      {
        if(mi1[qy][qx]==0&&mi2[qy][qx]==0)
        {
          cout<<qy<<" "<<qx<<endl;
          mi2[qy][qx]=1;
          dg(qx,qy);
          mi2[qx][qy]=0;
        }
      }
    }
  }
}
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=n;j++)
    {
      cin>>mi1[i][j];
    }
  }
  x1=1;
  y1=1;
  mi2[y1][x1]=1;
  x2=n;
  y2=1;
  dg(x1,y1);
  cout<<s;
}

image.gif


第二道题

题目:

2. 马的走法  (Standard IO)

时间限制: 1000 ms  空间限制: 262144 KB  具体限制  

题目描述:

在5X5的棋盘上,给定一位置,输出马回到原点有多少种不同的方案。

注意:马走的每一步必须在棋盘上,走斜日,如右图→:image.gif编辑

输入:

给定一位置,x ,y,中间有一空格隔开。

输出:

输出可以回到原点的方案总数

样例输入:

1 1

样例输出:

61424

小航想到(思路):

1.要用与上题不同的格式进行,因为起点就是终点。应使用如下格式:

void DFS(形式参数)
{
    for(...)
    {
        if(满足条件)
        {
            相应操作;
            if(到达终点)
            {
                记录;
            }
            else DFS(...)
            回溯;
        }
    }
}

image.gif

(第一次写伪代码,很烂,请谅解)

2.八种方向要记录(用一维数组或二维数组)

3.visit表记法也要用上!

小航写道(程序):

#include<iostream>
using namespace std;
int t,fangx[10]={0,-2,-2,-1,-1,1,1,2,2},fangy[10]={0,-1,1,-2,2,-2,2,-1,1},b[10][10],qx,qy;
void dg(int x1,int y1)
{
  for(int i=1;i<=8;i++)
  {
    int nx=x1+fangx[i],ny=y1+fangy[i];
    if(nx>=1&&nx<=5&&ny>=1&&ny<=5&&b[nx][ny]==0)
    {
      b[nx][ny]=1;
      if(nx==qx&&ny==qy)
      {
        t++;
      }
      else
      {
        dg(nx,ny);
      }
      b[nx][ny]=0;
    }
  }
}
int main()
{
  cin>>qx>>qy;
  dg(qx,qy);
  cout<<t;
}

image.gif


第三道题:

题目:

       1099. 【递归算法】棋子移动  (Standard IO)

时间限制: 1000 ms  空间限制: 262144 KB  具体限制  

题目描述:

有2n个棋子(n>=4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如图(n=5):00000*****

移动棋子的规则是:每次必须同时移动相邻两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:__0*0*0*0*0*

输入:

仅输入黑棋和白棋的数目n(4<=n<=1000)。

输出:

以后各行输出每一步的移动结果,最后一行输出总步数。其中用’O’(大写字母)表示白棋,用’ * ’表示黑棋。’_”(下划线)表示一个空位。

样例输入:

5

样例输出:

OOOO_ _****O*

OOOO****_ _O*

OOO_ _***O*O*

OOO*O**_ _*O*

O_ _*O**OO*O*

O*O*O*_ _O*O*

_ _O*O*O*O*O*

step=7

小航想道(思路):

1.请读者在评论区上填写,因为我太懒不想填写这样才能真正使读者成长。

小航写道(程序):

#include<iostream>
using namespace std;
int n,space,sum;
char a[2020];
void move(int s)
{
  a[space]=a[s];
  a[space+1]=a[s+1];
  a[s]='_';
  a[s+1]='_';
  space=s;
  sum++;
  for(int i=1;i<=n*2+2;i++)
  {
    cout<<a[i];
  }
  cout<<endl;
}
void digui(int m)
{
  if(m==4)
  {
    move(4);
    move(8);
    move(2);
    move(7);
    move(1);
  }
  else
  {
    move(m);
    move(2*m-1);
    digui(m-1);
  }
}
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    a[i]='O';
    a[i+n]='*';
  }
  a[n*2+1]='_';
  a[n*2+2]='_';
  space=n*2+1;
  digui(n);
  cout<<"step="<<sum;
}

image.gif

       因为这是级组里面的考试,所以并不是十分正规,这是等到比赛结束才能提交的。等待结束时,小航一直在检查(需要学习)……

       “叮——”比赛结束,小航立刻提交。几分钟后,三百分(满分)显现在小航的电脑屏幕之上——小航全级第一(这几乎人人都是),被分到了六班!这是他梦寐以求的班级!

相关文章
|
1月前
|
机器人
[leedcode]刷题有感--动态规划入门及思路模板
[leedcode]刷题有感--动态规划入门及思路模板
|
9月前
|
机器学习/深度学习 存储 算法
【DFS经典例题】2n皇后问题
【DFS经典例题】2n皇后问题
52 0
|
5月前
蓝桥杯vip测试题系统-数组求和(解题思路以及解题代码,手画思路图虽然丑丑的)
蓝桥杯vip测试题系统-数组求和(解题思路以及解题代码,手画思路图虽然丑丑的)
30 0
|
8月前
|
存储 索引
【LeetCode】每日一题:链表部分经典题型
【LeetCode】每日一题:链表部分经典题型
35 0
|
9月前
|
机器学习/深度学习 算法 定位技术
BFS经典例题详解
BFS经典例题详解
85 0
|
9月前
解密经典数学问题:跳马问题的DFS解法
本文介绍了跳马问题的背景和解析,并提供了一种基于DFS的解题思路。通过详细的代码实现和解题技巧的讲解,读者能够对跳马问题有更深入的理解和掌握。
104 0
|
10月前
力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现
力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现
104 0
|
11月前
蓝桥杯备赛leetcode 70.爬楼梯,用最经典的题目来讲解动态规划
题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼梯顶部呢?
蓝桥杯备赛leetcode 70.爬楼梯,用最经典的题目来讲解动态规划
|
12月前
|
存储 算法 C++
【每日算法Day 81】面试经典题:关于丑数,你真的理解为什么这么算吗?
【每日算法Day 81】面试经典题:关于丑数,你真的理解为什么这么算吗?
|
12月前
|
算法 C++
【每日算法Day 76】经典面试题:中序遍历的下一个元素,5大解法汇总!
【每日算法Day 76】经典面试题:中序遍历的下一个元素,5大解法汇总!