信息学奥赛一本通 1212:LETTERS 搜索与回溯算法
给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。时间限制: 1000 ms内存限制: 65536 KB。第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。最多能走过的不同字母的个数。接着输出R行S列字母矩阵。
·
1212:LETTERS
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。
【输入】
第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。
接着输出R行S列字母矩阵。
【输出】
最多能走过的不同字母的个数。
【输入样例】
3 6
HFDFFB
AJHGDH
DGAGEH
【输出样例】
6
解析:搜索,详见代码:
#include<bits/stdc++.h>
using namespace std;
int r, s;
char a[25][25];//字母矩阵
bool b[26];//字母是否经过
int ans = 0;
int dx[4] = {0, 0, 1, -1}; //四个方向
int dy[4] = {1, -1, 0, 0};
//从x,y出发,已经经过sum个字母
void dfs(int x, int y, int sum) {
ans = max(ans, sum); //取最大值
for(int i = 0; i < 4; i++) { //四个方向
int xx = x + dx[i];
int yy = y + dy[i];
//没出界,且目的地字母没有经过
if (xx >= 1 && xx <= r && yy >= 1 && yy <= s && b[a[xx][yy] - 'A'] == 0) {
b[a[xx][yy] - 'A'] = 1;//标记已经过
dfs(xx, yy, sum + 1);//继续搜索
b[a[xx][yy] - 'A'] = 0;//去除标记,回溯
}
}
}
int main() {
cin >> r >> s;
for(int i = 1; i <= r; i++) {
for(int j = 1; j <= s; j++) {
cin >> a[i][j];
}
}
b[a[1][1] - 'A'] = 1; //标记出发点字母已经经过
dfs(1, 1, 1); //从1,1出发,经过一个字母
cout << ans;
return 0;
}
更多推荐
所有评论(0)