ybt 第二部分 基础算法 --> 第五章 搜索与回溯算法 1212 LETTERS
1212:LETTERS
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 11351 通过数: 5011
【题目描述】
给出一个roe×colroe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。
【输入】
第一行,输入字母矩阵行数RR和列数SS,1≤R,S≤201≤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]都进行搜索,选出可行方案并比较经过点数的多少