1212:レター
制限時間:1000ミリ秒メモリ制限:65536 KB
コミット数:11866パス:5252
[タイトルの説明]
roe×col大文字のマトリックスを指定します。開始位置は左上隅であり、上下左右に移動できます。 、合格した文字には移動できません。数文字以内で質問してください。
[入力]
1行目に、文字行列の数Rと列の数Sを入力します。1≤R、S≤20。
次に、行Rと列Sの文字行列を出力します。
[出力]
トラバースできるさまざまな文字の最大数。
【入力例】
3 6
HFDFFB
AJHGDH
DGAGEH
【出力例】
6
説明:最初のコードはタイトルACに準拠しており、2番目のコードは最大出力パスが追加されたコードです。(2番目のコードは子供からの通知です。この質問を深め、もう1つ質問を追加して、出力パスを記録する必要があります)
#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
*/