• LOJ P10030 Keyboarding 题解


    每日一题 day69 打卡

    Analysis

    这道题题目有点难懂,但看懂了之后感觉并不难。

    大体思路是先预处理出键盘中每一位的上下左右第一个能到的点的坐标,然后就可以广搜了。

    然而,这道题有很多坑点:

    1.最后结尾还要加一个' * '

    2.还需要加一个剪枝,不然过不了

            剪枝:开一个book数组记录在键盘上到每个点所能完成的最终串的长度。如果再次到了一个点发现能完成的还不如之前多就不再走了

    3.上面剪枝用的book数组初值要赋成负数(0为什么不行自己好好想想)

    处理完这些细节这道题基本就完成了,还有什么不懂的看代码

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<queue>
      6 #define int long long
      7 #define maxn 50+10
      8 #define maxm 10000+10
      9 #define rep(i,s,e) for(register int i=s;i<=e;++i)
     10 #define dwn(i,s,e) for(register int i=s;i>=e;--i)
     11 using namespace std;
     12 inline int read()
     13 {
     14     int x=0,f=1;
     15     char c=getchar();
     16     while(c<'0'||c>'9') {if(c=='-') x=-x; c=getchar();}
     17     while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
     18     return f*x;
     19 }
     20 inline void write(int x)
     21 {
     22     if(x<0){putchar('-');x=-x;}
     23     if(x>9)write(x/10);
     24     putchar(x%10+'0');
     25 }
     26 int n,m,len;
     27 char map[maxn][maxn];
     28 char target[maxm];
     29 int book[maxn][maxn];
     30 int dx[5]={0,1,0,-1,0},dy[5]={0,0,-1,0,1};
     31 struct node_point
     32 {
     33     int x,y;
     34 }nex[maxn][maxn][5];
     35 struct node_queue
     36 {
     37     int x,y,l,s;
     38 }x[maxm];
     39 queue<node_queue> q;
     40 void init()
     41 {
     42     rep(i,1,n)
     43     {
     44         rep(j,1,m)
     45         {
     46             char ch=map[i][j];
     47             rep(k,i+1,n)
     48             {
     49                 if(ch!=map[k][j])
     50                 {
     51                     nex[i][j][1].x=k;
     52                     nex[i][j][1].y=j;
     53                     break;
     54                 }
     55             }
     56             rep(k,j+1,m)
     57             {
     58                 if(ch!=map[i][k])
     59                 {
     60                     nex[i][j][2].x=i;
     61                     nex[i][j][2].y=k;
     62                     break;
     63                 }
     64             }
     65             dwn(k,i-1,1)
     66             {
     67                 if(ch!=map[k][j])
     68                 {
     69                     nex[i][j][3].x=k;
     70                     nex[i][j][3].y=j;
     71                     break;
     72                 }
     73             }
     74             dwn(k,j-1,1)
     75             {
     76                 if(ch!=map[i][k])
     77                 {
     78                     nex[i][j][4].x=i;
     79                     nex[i][j][4].y=k;
     80                     break;
     81                 }
     82             }
     83         }
     84     }    
     85 }
     86 void dfs()
     87 {
     88     while(!q.empty())
     89     {
     90         node_queue now=q.front();
     91         q.pop();
     92         int nx=now.x,ny=now.y,nl=now.l,ns=now.s;
     93         if(map[nx][ny]==target[nl+1])
     94         {
     95             if(nl+1==len)
     96             {
     97                 write(ns+1);
     98                 return;
     99             }
    100             q.push((node_queue){nx,ny,nl+1,ns+1});
    101         }
    102         rep(i,1,4)
    103         {
    104             int xx=nex[nx][ny][i].x,yy=nex[nx][ny][i].y,ss=ns+1;
    105             if(xx<1||xx>n||yy<1||yy>m||book[xx][yy]>=nl) continue;
    106             book[xx][yy]=nl;
    107             q.push((node_queue){xx,yy,nl,ss});
    108         }
    109     }
    110 }
    111 signed main()
    112 {
    113     
    114     n=read();m=read();
    115     rep(i,1,n) cin>>map[i]+1;
    116     cin>>target+1;
    117     len=strlen(target+1);
    118     target[++len]='*';
    119     init();
    120     q.push((node_queue){1,1,0,0});
    121     memset(book,0xff,sizeof(book));
    122     dfs();
    123     return 0;
    124 }

    如有失误请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    windows版本nginx帮助文档
    angular渲染超链接bug
    ionic踩过的一些坑
    ionic项目中使用自定义图标打包出现错误-broken import
    ionic项目中使用自定义图标
    ionic3运行时gradle下载失败的解决方法
    阿里云菜鸡上云实例
    如何用手机控制pc鼠标——Java开发与学习记实
    LeetCode刷题笔记---6月
    编译原理复习题
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/12372146.html
Copyright © 2020-2023  润新知