1212:LETTERS
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 11866 通过数: 5252
【题目描述】
给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。
【输入】
第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。
接着输出R行S列字母矩阵。
【输出】
最多能走过的不同字母的个数。
【输入样例】
3 6
HFDFFB
AJHGDH
DGAGEH
【输出样例】
6
解释: 第一段代码是按照题目AC,第二段代码是添加了输出最大路径的代码。(第二段代码是孩子给我提醒,需要加深一下这个题目,加多一个问题,记录输出路径)
#include<bits/stdc++.h>
using namespace std;
int a[25][25],ans,r,s;
bool v[25][25],e[27];
int f[4][2]={{0,1},{1,0},{-1,0},{0,-1}}; // 四个方向
bool is(int x,int y){
return x>=0 && y>=0 && x<r && y<s && e[a[x][y]]==0 && v[x][y]==0;
}
void dfs(int x,int y,int sum){
ans = max(ans,sum);
for(int i=0;i<4;i++){
int xx = x + f[i][0];
int yy = y + f[i][1];
if(is(xx,yy)){
v[xx][yy] = true;
e[a[xx][yy]] = true;
// printf("xx:%d,yy:%d\n",xx,yy);
dfs(xx,yy,sum+1);
v[xx][yy] = false;
e[a[xx][yy]] = false;
}
}
return;
}
int main(){
cin>>r>>s;
for(int i=0;i<r;i++){
for(int j=0;j<s;j++){
char tmp;
cin>>tmp;
a[i][j] = tmp - 'A';
}
}
// for(int i=0;i<r;i++){
// for(int j=0;j<s;j++){
// printf("%d ",a[i][j]);
// }
// cout<<endl;
// }
e[a[0][0]] = true;
v[0][0] = true;
dfs(0,0,1);
cout<<ans;
return 0;
}
/*
3 6
HFDFFB
AJHGDH
DGAGEH
*/
用v来存走过的地址,并且输出。
#include<bits/stdc++.h>
using namespace std;
int a[25][25],ans,r,s;
int v[25][25],e[27],b[25][25];
int f[4][2]={{0,1},{1,0},{-1,0},{0,-1}}; // 四个方向
bool is(int x,int y){
return x>=0 && y>=0 && x<r && y<s && e[a[x][y]]==0 && v[x][y]==0;
}
void dfs(int x,int y,int sum){
// ans = max(ans,sum);
if(ans<sum){
ans = sum;
for(int i=0;i<r;i++){
for(int j=0;j<s;j++){
b[i][j] = v[i][j];
}
}
}
for(int i=0;i<4;i++){
int xx = x + f[i][0];
int yy = y + f[i][1];
if(is(xx,yy)){
v[xx][yy] = sum+1;
e[a[xx][yy]] = true;
// printf("xx:%d,yy:%d\n",xx,yy);
dfs(xx,yy,sum+1);
v[xx][yy] = false;
e[a[xx][yy]] = false;
}
}
return;
}
int main(){
freopen("cpp.in","r",stdin);
freopen("cpp.out","w",stdout);
cin>>r>>s;
for(int i=0;i<r;i++){
for(int j=0;j<s;j++){
char tmp;
cin>>tmp;
a[i][j] = tmp - 'A';
}
}
// for(int i=0;i<r;i++){
// for(int j=0;j<s;j++){
// printf("%d ",a[i][j]);
// }
// cout<<endl;
// }
e[a[0][0]] = true;
v[0][0] = true;
dfs(0,0,1);
cout<<ans<<endl;
for(int i=0;i<r;i++){
for(int j=0;j<s;j++){
printf("%d ",b[i][j]);
}
cout<<endl;
}
return 0;
}
/*
3 6
HFDFFB
AJHGDH
DGAGEH
*/