信息学奥数一本通 1212:LETTERS 搜索与回溯(耙耙)

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
*/
发布了33 篇原创文章 · 获赞 0 · 访问量 167

猜你喜欢

转载自blog.csdn.net/weixin_42790071/article/details/105558252
今日推荐