Informatics Olympiad One Pass 1212:文字検索とトレースバック(レイク)

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
*/
公開された33元の記事 ウォンの賞賛0 ビュー167

おすすめ

転載: blog.csdn.net/weixin_42790071/article/details/105558252