深度优化搜索,字典树

简介: 深度优化搜索,字典树

小红走矩阵

题目描述

小红来到了一个n∗m的矩阵,她初始站在左上角,每次行走可以按“上下左右”中的一个方向走一步,但必须走到和当前格子不同的字符,也不能走到矩阵外。


小红想知道,从左上角走到右下角最少需要走多少步?

输入描述:

第一行输入两个正整数n,m,用空格隔开。代表矩阵的行数和列数。


接下来的nnn行,每行输入一个长度为m的、仅由小写字母组成的字符串,用来表示矩阵。

1≤n,m≤1000

输出描述:

如果无法到达右下角,则输出-1。

否则输出一个整数,代表行走的最小步数。


输入

3 4

abbc

accd

bcee

输出

9

说明

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
using T=tuple<int,int,int>;
const int N=1005;
string a[N];
bool b[N][N];
int n,m;
int bfs()
{
  queue<T> q;
  int x,y,z,nx,ny,i;
  q.emplace(0,0,0);
  b[0][0]=true;
  while(!q.empty())
  {
    tie(x,y,z)=q.front();
    q.pop();
    if(x==n-1&&y==m-1)
      return z;
    else
    {
      for(i=0;i<4;++i)
      {
        nx=x+dx[i];
        ny=y+dy[i];
        if(0<=nx&&nx<n&&0<=ny&&ny<m&&!b[nx][ny]&&a[x][y]!=a[nx][ny])
        {
          b[nx][ny]=true;
          q.emplace(nx,ny,z+1);
        }
      }
    }
  }
  return -1;
}
int main(void)
{
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  int i,j;
  cin>>n>>m;
  for(i=0;i<n;++i)
    cin>>a[i];
  cout<<bfs();
  return 0;
}

小红的小红走矩阵

题目描述

小红在出题“小红的走矩阵”时,在数据生成的环节发现了一些问题。

如果直接随机生成一个矩阵,那么结果大概率可以直接输出 n+m−2。

如果直接生成极限数据,那么结果也将是跑完整个矩阵,因此可以直接输出 n∗m−1。

为了避免以上的情况骗到分,于是小红想到了另一个方案:先随机生成一个从 (1,1)( 到 (n,m)的路径,再将路径以外的矩阵的部分全部填成同一个字符。这样一来看似数据确实强,答案并不固定,但实际上也有非常明显的弊端,因为矩阵中大部分都是同一个字符,且这个字符在路径之外,因此选手可以通过“矩阵中是否存在绝对众数”来判断数据是否是这样的数据。

因此小红现在在数据生成的问题上犯了难,她希望小苯帮她来完成本题数据的生成,即请你来代替小苯构造出本题较强的数据。

使得所有的数据都能满足以下的所有条件:

1.1.1. 直接输出 n+m−2n会返回答案错误,换句话说,“小红走矩阵”这题的正确代码运行后的结果不是 n+m−2。

2.2.2. 直接输出 n∗m−1 也会返回答案错误,换句话说,“小红走矩阵”这题的正确代码运行后的结果不是 n∗m−1。

3.3.3. 生成的矩阵中,不存在“绝对众数”。(即,没有任何字符的出现次数大于 n∗m/2 向上取整)

4.4.4. 生成的矩阵必须能从 (1,1)走到 (n,m),换句话说,“小红走矩阵”这题的正确代码运行后的结果不是 −1。

输入描述:

输入包含一行两个正整数 n,m (3≤n,m≤10^3),分别表示需要生成的矩阵的大小,以空格分割。

输出描述:

输出包含一个 n 行 m列 的字符矩阵,满足题目所述的要求,且仅由小写英文字母构成。(如果有多种方案,输出任意即可)


输入

3 4

输出

abbc

accd

bcee

说明

路线如图,最短路长度为9,且满足题目的所有条件。

备注:

#include<iostream>
#include<string.h>
#include<bits/stdc++.h>
using namespace std;
int main(){
    int m, n;
    cin >> m >> n;
    cout << "abb" << string(n - 3, 'a') << '\n';
    cout << "acc" << string(n - 3, 'b') << '\n';
    cout << "bcd" ;
    for(int i = 3; i < n; i ++)
         { 
            char s = ('a' + (i + m) % 26);
            cout << s;
          }
    cout <<'\n';
    for(int i = 3; i < m - 1; ++i )
    {
        char s= ('a' + i % 26);
        cout << string(n,s) <<'\n';
    }
    if(m > 3){
        for(int i = 0; i < n; i ++)
         { 
            char s= ('a' + (i + m) % 26);
            cout << s;
          }   
    }   
}

 

目录
相关文章
|
存储 缓存 运维
函数计算产品使用问题之SD上安装了inpaint anything插件,但是不显示,该如何解决
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
990 0
|
网络协议 Java 关系型数据库
一篇文章彻底理解数据库的各种 JDBC 超时参数 2
一篇文章彻底理解数据库的各种 JDBC 超时参数
|
存储 C语言 索引
【C语言】深入解开指针(四)3
【C语言】深入解开指针(四)3
|
编译器 C语言
C语言收尾 预处理相关知识
C语言收尾 预处理相关知识
78 0
|
存储 运维 开发工具
emas
emas
561 0
|
缓存 Java C++
HTTP 头部:你不可不知的网页开发基础(下)
HTTP 头部:你不可不知的网页开发基础(下)
HTTP 头部:你不可不知的网页开发基础(下)
|
Web App开发 JSON 数据格式
这款 Chrome 插件,让你的项目联调 so easy
poseidon-chrome-proxy 是一款浏览器请求代理插件;它能把向服务器发起的请求代理到本地,并且可以修改其请求头。 通过这个插件我们可以降低前后端联调的成本,以及帮助我们快速定位线上 bug。
|
存储 Java 索引
BlockingQueue
网上看了好多文章将线程池的但是似乎都没的多少人会详细讲解里面的任务队列,所以只有自己动手学习其中的任务队列 BlockingQueue
3167 0
BlockingQueue
|
Linux
Linux系统之硬链接和软链接
Linux系统之硬链接和软链接
253 0
Linux系统之硬链接和软链接