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]都进行搜索,选出可行方案并比较经过点数的多少
posted @ 2020-02-24 17:06  雾隐  阅读(320)  评论(0编辑  收藏  举报