Codeforces Round #224 (Div. 2) D 暴力搜索加记忆化_html/css_WEB-ITnose

php中文网
发布: 2016-06-24 12:00:10
原创
1593人浏览过

题意读了半年,英语太渣,题意是摆两个棋子在棋盘上作为起点,但是起点不能在#上,然后按照图的指示开始走, 右 ^上 v下,走的时候只能按照图的指示走,如果前方是 #的话,可以走进去,但是 走进去之后便不能再走了,走的途中两个棋子不能相碰,但是最终都走到同一个#里是没事的,并且若是能走 无限步的话 输出 -1, 例如  >


立即学习前端免费学习笔记(深入)”;

一开始被输出-1给困住了,因为除了 .>

求出每个点作为起点的最大步数以后,开始寻找,若有两个点的最大步数相同,而且他们在走的过程中没有相碰,这样最大步数和 就是 ans + ans  ,若找不到的话 一前一后放置两个棋子肯定就是最优得了  也就是 ans + ans - 1,好了就是代码的 实现了,深搜写的有点搓, 

纳米搜索
纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30
查看详情 纳米搜索


立即学习前端免费学习笔记(深入)”;

const int MAXN = 8000000 + 55;char aa[2000 + 55][2000 + 55];int mp[2000 + 55][2000 + 55];int xx[5] = {-1,1,0,0};int yy[5] = {0,0,-1,1};int dis[2000 + 55][2000 + 55];bool vis[2000 + 55][2000 + 55];int bb[2000 + 55][2000 + 55];int n,m;int ans;void init() {	memset(aa,0,sizeof(aa));	memset(mp,0,sizeof(mp));	memset(dis,-1,sizeof(dis));	memset(vis,0,sizeof(vis));	memset(bb,-1,sizeof(bb));}bool input() {	while(scanf("%d %d",&n,&m) == 2) {		for(int i=0;i<n;i++) {			scanf("%s",aa[i]);			for(int j=0;j<m;j++) {				if(aa[i][j] == '#')mp[i][j] = -1;				if(aa[i][j] == '^')mp[i][j] = 0;				if(aa[i][j] == 'v')mp[i][j] = 1;				if(aa[i][j] == '<')mp[i][j] = 2;				if(aa[i][j] == '>')mp[i][j] = 3;			}		}		return false;	}	return true;}bool isok(int x,int y) {	if(x <0 || x >=n || y < 0 || y >= m)return true;	return false;}int dfs1(int x,int y) {	if(isok(x,y))return 0;	if(vis[x][y])return MAXN;	if(dis[x][y] != -1) return dis[x][y];	vis[x][y] = 1;	if(mp[x][y] == -1) {		vis[x][y] = 0;		dis[x][y] = 0;		return 0;	}	else {		int tmp = dfs1(x + xx[mp[x][y]],y + yy[mp[x][y]]) + 1;		vis[x][y] = 0;		dis[x][y] = tmp;		return tmp;	}}int dfs2(int x,int y,int cnt) {	if(bb[x][y] != -1) {		if(bb[x][y] == cnt && mp[x][y] != -1)return 0;		return 1;	}	if(mp[x][y] == -1) {		bb[x][y] = cnt;		return 1;	}	else {		bb[x][y] = cnt;		return dfs2(x + xx[mp[x][y]],y + yy[mp[x][y]],cnt + 1);	}}void cal() {	ans = 0;	int mark;	for(int i=0;i<n;i++) {		for(int j=0;j<m;j++) {			if(mp[i][j] == -1)continue;			if(dis[i][j] != -1)continue;			int tmp = dfs1(i,j);			if(tmp >= MAXN){ans = MAXN;return;}			ans = max(ans,tmp);		}	}	if(ans == 0)return ;	mark = 0;	for(int i=0;i<n;i++) {		for(int j=0;j<m;j++) {			if(dis[i][j] == ans) {				if(dfs2(i,j,1))mark++;				if(mark > 1){ans *= 2;return ;}			}		}	}	ans += (ans - 1);}void output() {	if(ans >= MAXN)puts("-1");	else cout<<ans<<endl;}int main () {	while(true) {		init();		if(input())return 0;		cal();		output();	}}
登录后复制


HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号