• 搜索练习题LETTERS



    题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1212    或者http://poj.org/problem?id=1154


     

    题目描述:

    给出一个roe×colroe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。

    【输入】

    第一行,输入字母矩阵行数RR和列数SS,1R,S201≤R,S≤20。

    接着输出RR行SS列字母矩阵。

    【输出】

    最多能走过的不同字母的个数。

    【输入样例】

    3 6
    HFDFFB
    AJHGDH
    DGAGEH
    

    【输出样例】

    6

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int MAXN=50;
     4 int r,s,ans;                                    // R,S分别表示行数和列数,ans表示最多经过字母数
     5 char a[MAXN][MAXN]; 
     6 int dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 };   // dir数组用于表示上下左右4个方向
     7 bool vis[26];   // vis数组用于记录26个字母是否有走过,其中'A'对应vis[0],'B'对应vis[1],…
     8 //用于判断第x行第y列的元素是否超过地图边界
     9 bool isp(int x,int y){
    10     return x>=0&&x<r&&y>=0&&y<s;                //一开始写了x<=r&&y<=s不对 ,后来发现数组越界了 
    11 }
    12 void dfs(int x,int y,int sum){                    // dfs函数用于搜索,它表示当前在第x行第y列,已经走了sum步
    13     vis[a[x][y]-'A']=true;                        // 首先将当且(x,y)这个点对应的字母的vis值标记为true
    14     if(sum>ans)    ans=sum;
    15     for(int i=0;i<4;i++){
    16         int nx=x+dir[i][0];
    17         int ny=y+dir[i][1];
    18         if(isp(nx,ny) && !vis[a[nx][ny]-'A'])
    19             dfs(nx,ny,sum+1);
    20     }
    21     vis[a[x][y] - 'A' ] = false;                  // 因为搜索是尝试放,所以推出本次搜索记得将vis值标记回false    
    22 }
    23 int main(){
    24     cin>>r>>s;
    25     for(int i=0;i<r;i++)
    26         for(int j=0;j<s;j++)
    27             cin>>a[i][j];
    28     dfs(0,0,1);
    29     cout<<ans<<endl;
    30     return 0;
    31 } 
    
    
  • 相关阅读:
    0722
    SGU
    预测一下吧
    0625
    0624
    0610
    0607
    0604
    poj2455Secret Milking Machine【二分 + 最大流】
    BZOJ3489: A simple rmq problem
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/12367458.html
Copyright © 2020-2023  润新知