每天一道英文题,ICPC不自闭(24)

NOI openjudge 156:LETTERS

题目翻译

单人游戏是在矩形棋盘上进行的,棋盘分为R行和C列。黑板上的每个位置都有一个大写字母(A-Z)。

在开始之前,棋盘的左上角(第一行,第一列)有一个人物。在每一步中,玩家都可以将人物移动到相邻的位置之一(上、下、左或右)。唯一的限制是一个数字不能访问同一个字母标记的位置两次。

游戏的目标是尽可能多的移动。

编写一个程序,计算人物在一场游戏中可以访问的棋盘上的最大位置数。

输入

输入的第一行包含两个整数R和C,由一个空白字符分隔,1<=R,C<=20。以下R行各包含C个字符。每行代表棋盘上的一行。

输出

输出的第一行也是唯一一行应该包含图形可以访问的板中的最大位置数。

样例

输入

3 6
HFDFFB
AJHGDH
DGAGEH

输出

6

解题思路

按题目要求,暴力搜索。

代码示例

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int r,c;
int ans;
string S[22];
char s[22][22];
bool book[101001];

void dfs(int x,int y,int cnt){
	ans=max(ans,cnt);
	if(!book[s[x+1][y]]&&x+1<=r){
		book[s[x+1][y]]=1;
		dfs(x+1,y,cnt+1);
		book[s[x+1][y]]=0;
	}
	if(!book[s[x][y+1]]&&y+1<=c){
		book[s[x][y+1]]=1;
		dfs(x,y+1,cnt+1);
		book[s[x][y+1]]=0;
	}
	if(!book[s[x-1][y]]&&x-1>=1){
		book[s[x-1][y]]=1;
		dfs(x-1,y,cnt+1);
		book[s[x-1][y]]=0;
	}
	if(!book[s[x][y-1]]&&y-1>=1){
		book[s[x][y-1]]=1;
		dfs(x,y-1,cnt+1);
		book[s[x][y-1]]=0;
	}
}

int main(){
	cin>>r>>c;
	for(int i=0;i<r;i++) cin>>S[i];
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			s[i][j]=S[i-1][j-1];
	book[s[1][1]]=1;
	dfs(1,1,1);
	cout<<ans<<endl;
	return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值