zoukankan      html  css  js  c++  java
  • ybt 第二部分 基础算法 --> 第五章 搜索与回溯算法 1212 LETTERS

    1212:LETTERS


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 11351     通过数: 5011 

    【题目描述】

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

    【输入】

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

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

    【输出】

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

    代码

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    
    int n,m,ans=-1;
    int go[10][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};
    int letter[27];
    char a[1000][1000];
    bool vis[1000][1000];
    
    void search(int x,int y,int step)
    {
    	if(ans<step)
    	{
    		ans=step;
    	}
    	for(int i=1;i<=4;i++)
    	{
    		int next_x=x+go[i][0];
    		int next_y=y+go[i][1];
    		if((next_x<=n&&next_x>0)&&(next_y<=m&&next_y>0)&&(vis[next_x][next_y]==0)&&(letter[a[next_x][next_y]-'A']==0))
    		{
    		    vis[next_x][next_y]=1;
    		    letter[a[next_x][next_y]-'A']=1;
    		    search(next_x,next_y,step+1);
    		    vis[next_x][next_y]=0;
    		    letter[a[next_x][next_y]-'A']=0;
    		}
    	}
    }
    
    
    
    int main(void)
    {
        cin>>n>>m;
        
        for(int i=1;i<=n;i++)
        {
        	for(int j=1;j<=m;j++)
        	{
        		cin>>a[i][j];
    		}
    	}
    	
    	vis[1][1]=1;
    	letter[a[1][1]-'A']=1;
    	
    	search(1,1,1);
    	
    	cout<<ans<<endl;
    	
        return 0;
    }

    这道题一开始并没有理解题意,仅筛选了没有经过的点,QWQ

    要筛选经过的字母,可以通过引入字符数组存放选过的字母,或bool型数组判断字母是否被选,并用vis数组来存放点是否被走过
    走的方向,用dir数组来进行判断,将从某一点出发的[i-1][j],[i+1][j],[i][j-1],[i][j+1]都进行搜索,选出可行方案并比较经过点数的多少
  • 相关阅读:
    Adobe Photoshop cs6 破解方法
    vs2008试用90天破解方法
    Install win8_pro using UltraISO
    面试题-100盏灯问题
    PHP 博客文集 1 Veda原型 成功,唯有积累,没有奇迹
    php 框架
    php 语法2
    干货 连接
    试题 极客学院
    地图
  • 原文地址:https://www.cnblogs.com/jd1412/p/12357666.html
Copyright © 2011-2022 走看看