`
xxx0624
  • 浏览: 31758 次
文章分类
社区版块
存档分类
最新评论

HDU4528+BFS

 
阅读更多
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
using namespace std;
const int maxn = 115;
const int inf = 9999999;
char mat[ maxn ][ maxn ];
int vis[ maxn ][ maxn ][ 2 ][ 2 ];
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
struct Pos{
	int x,y;
};
struct Node{
	int x,y,ti;
	int D,E;//flag
};
Pos D,S,E;
void init(){
	for( int i=0;i<maxn;i++ )
		for( int j=0;j<maxn;j++ )
			mat[i][j] = 'X';
}

bool in( Node p,int n,int m ){
	if( p.x>=0&&p.x<n&&p.y>=0&&p.y<m )
		return true;
	else
		return false;
}
bool Judge1( Node tmp ){
	int x = tmp.x;
	int y1 = min( tmp.y,D.y );
	int y2 = max( tmp.y,D.y );
	for( int i=y1+1;i<y2;i++ ){
		if( mat[x][i]=='X' ) return false;
		else if( mat[x][i]=='.' ){
			if( x==D.x&&i==D.y ) return false;
			else if( x==E.x&&i==E.y ) return false;
		}
	}
	return true;
}
bool Judge2( Node tmp ){
	int x = tmp.x;
	int y1 = min( tmp.y,E.y );
	int y2 = max( tmp.y,E.y );
	for( int i=y1+1;i<y2;i++ ){
		if( mat[x][i]=='X' ) return false;
		else if( mat[x][i]=='.' ){
			if( x==D.x&&i==D.y ) return false;
			else if( x==E.x&&i==E.y ) return false;
		}
	}
	return true;
}
bool Judge3( Node tmp ){
	int y = tmp.y;
	int x1 = min( tmp.x,D.x );
	int x2 = max( tmp.x,D.x );
	for( int i=x1+1;i<x2;i++ ){
		if( mat[i][y]=='X' ) return false;
		else if( mat[i][y]=='.' ){
			if( i==D.x&&y==D.y ) return false;
			else if( i==E.x&&y==E.y ) return false;
		}
	}
	return true;
}
bool Judge4( Node tmp ){
	int y = tmp.y;
	int x1 = min( tmp.x,E.x );
	int x2 = max( tmp.x,E.x );
	for( int i=x1+1;i<x2;i++ ){
		if( mat[i][y]=='X' ) return false;
		else if( mat[i][y]=='.' ){
			if( i==D.x&&y==D.y ) return false;
			else if( i==E.x&&y==E.y ) return false;
		}
	}
	return true;
}

int bfs( int n,int m,int aim_ti ){
	Node cur,nxt;
	cur.x = S.x;
	cur.y = S.y;
	cur.ti = 0;
	cur.D = cur.E = 0;
	queue<Node>q;
	while( !q.empty() )
		q.pop();
	q.push( cur );
	int ans = inf;
	vis[ cur.x ][ cur.y ][ cur.D ][ cur.E ] = 1;
	while( !q.empty() ){
		cur = q.front();
		q.pop();
		if( cur.ti>aim_ti ) continue;
		//printf("cur:x=%d,y=%d,ti=%d\n",cur.x,cur.y,cur.ti);
		if( cur.x==D.x&&Judge1( cur )==true ) cur.D = 1;
		if( cur.x==E.x&&Judge2( cur )==true ) cur.E = 1;
		if( cur.y==D.y&&Judge3( cur )==true ) cur.D = 1;
		if( cur.y==E.y&&Judge4( cur )==true ) cur.E = 1;
		if( cur.D==1 ) {
			if( cur.E==1 ){
				if( ans>cur.ti ){
					ans = cur.ti;
				}
			}
		}
			//printf("ans:%d\n",ans);
		for( int i=0;i<4;i++ ){
			nxt = cur;
			nxt.x+=dx[i];
			nxt.y+=dy[i];
			nxt.ti++;
			if( in( nxt,n,m )==true&&mat[nxt.x][nxt.y]!='X'&&vis[nxt.x][nxt.y][nxt.D][nxt.E]==0 ){
				vis[nxt.x][nxt.y][nxt.D][nxt.E] = 1;
				q.push(nxt);
			}
		}
	}
	if( ans>aim_ti ) return -1;
	else return ans;
}

int main(){
	int ca,T;
	scanf("%d",&ca);
	T = 1;
	while( ca-- ){
		int n,m,aim_ti;
		printf("Case %d:\n",T++);
		init();
		scanf("%d%d%d",&n,&m,&aim_ti);
		for( int i=0;i<n;i++ ){
			scanf("%s",mat[i]);
			for( int j=0;j<m;j++ ){
				if( mat[i][j]=='D' ){
					D.x = i;
					D.y = j;
					mat[i][j]='X';
				}
				else if( mat[i][j]=='S' ){
					S.x = i;
					S.y = j;
					mat[i][j]='.';
				}
				else if( mat[i][j]=='E' ){
					E.x = i;
					E.y = j;
					mat[i][j]='X';
				}
			}
		}
		memset( vis,0,sizeof( vis ) );
		int ans = bfs( n,m,aim_ti );
		printf("%d\n",ans);
	}
	return 0;
}


分享到:
评论

相关推荐

    bfs.rar_hdu

    题目“bfs.rar_hdu”暗示了这是一个关于广度优先搜索(Breadth-First Search, BFS)的问题,源自HDU(杭州电子科技大学)的在线编程竞赛平台。通常,这类题目会涉及图论或者树的遍历,考察算法实现和逻辑思维能力。 ...

    hdu.rar_hdu

    7. **模板代码**:如快速幂、二分查找、DFS/BFS等常用算法的通用实现。 8. **问题解决策略**:理解题目需求、设计合适的数据结构、分析时间复杂度和空间复杂度、调试和优化代码。 9. **调试技巧**:使用调试工具...

    HDU题目java实现

    8. **图论与树**:HDU题目中可能涉及图的遍历(深度优先搜索DFS、广度优先搜索BFS)、树的遍历(前序、中序、后序)以及最小生成树、最短路径等算法。 9. **动态规划**:这是一种优化策略,通过构建状态转移方程来...

    acm入门之枚举搜索

    acm入门之枚举搜索,学校第一次acm培训,包括枚举及其优化,dfs和bfs

    Hdu1000—2169部分代码

    2. **搜索算法**:深度优先搜索(DFS)、广度优先搜索(BFS)、二分查找等。 3. **动态规划**:解决具有重叠子问题和最优子结构的问题。 4. **图论算法**:最短路径算法(Dijkstra、Floyd-Warshall)、拓扑排序、...

    hdu acm 教案(7)

    HDU ACM教案是针对ACM/ICPC(国际大学生程序设计竞赛)的训练教程,旨在帮助参赛者提升算法和编程技能。"搜索入门"这部分内容是教程中的一个重要章节,主要介绍在解决算法问题时如何有效地运用搜索策略。在这个章节...

    HDU图论题目分类

    2. 图的遍历:深度优先搜索(DFS)、广度优先搜索(BFS)等。 * 题目1043:Eight,涉及到多种解决方法。 * 题目1044:Collect More Jewels,涉及到动态规划(DP)的概念。 3. 图的搜索:图的搜索算法、图的路径查找...

    搜索bfs,dfs

    在提供的资源中,"HDUACM201603版_09)搜索入门.ppt"可能包含了对这两种搜索策略的详细讲解,包括它们的定义、算法实现、优缺点以及在实际问题中的应用案例。通过学习这份资料,你可以深入理解BFS和DFS的工作原理,...

    ACM hdu 代码大全3000例,部分代码有详细解析

    《ACM HDU代码大全3000例:探索算法与编程艺术》 在计算机科学领域,特别是竞赛编程中,ACM(国际大学生程序设计竞赛)是一项极富挑战性的活动,它不仅锻炼了参赛者的逻辑思维能力,还提高了他们在算法设计和实现上...

    hdu题目分类

    搜索算法是解决问题的一种通用方法,包括深度优先搜索(DFS)、广度优先搜索(BFS)等。搜索题目如1010、1015等,要求选手能够构建合适的搜索树或图,通过遍历所有可能的路径来寻找解决方案。这类题目不仅考察算法...

    HDU 专题分类(2013年8月)

    本文将详细解析“最短路径海滨练习”、“背包问题专题练习”以及“BFS练习”三个主题,深入探讨每个题目背后的算法原理与应用场景。 ### 最短路径海滨练习 #### 1. AWalkThroughtheForest (森林之旅) - **问题描述...

    hdu acm 2010多校联合(10)1009

    从解题的角度来看,处理树形结构的问题通常涉及遍历(如深度优先搜索DFS或广度优先搜索BFS)、查找、插入和删除操作。参赛者可能需要理解并运用递归、栈、队列等数据结构和算法来解决问题。对于AC代码的优化,可能会...

    hdu2000-2014ac代码

    5. **图论**:图的遍历(深度优先搜索DFS和广度优先搜索BFS)、最小生成树(Prim和Kruskal算法)、最短路径(Dijkstra和Floyd算法)等。在解决网络问题、旅行商问题等时,图论知识至关重要。 6. **递推和动态规划**...

    hdu排序练习

    5. **图论算法**:包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法、Floyd算法)、最小生成树算法(如Prim算法、Kruskal算法)等,用于解决图相关的复杂问题。 ### 知识点三:实战...

    ACM-HDU涉及了很多算法

    在ACM(国际大学生程序设计竞赛)中,HDU(杭州电子科技大学)的在线判题系统是许多参赛者磨炼算法技巧的重要平台。这个平台涵盖了众多的算法问题,旨在提升参赛者的编程能力和逻辑思维能力。以下是对标题和描述中...

    HDU-ACM课件.rar

    HDU-ACM课件.rar 是一个专门为编程竞赛爱好者准备的资源包,主要涵盖了ACM(国际大学生程序设计竞赛)中常见的算法知识。这个压缩包包含了一系列与算法相关的主题,旨在帮助初学者理解和掌握基础及进阶算法。下面将...

    ACM hdu 代码大全3000例

    例如,文件“HDU2000.cpp”可能涉及了二叉树的遍历或图的深度优先搜索(DFS)或广度优先搜索(BFS)。 2. **排序与查找**:快速排序、归并排序、堆排序等排序算法以及二分查找、哈希查找等查找算法在解题中广泛应用...

    hdu ACM代码 每种算法都有分类

    HDU ACM代码集合是针对ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)的一份资源,这个压缩包中的代码涵盖了多种算法,是参赛者或对算法学习感兴趣的人宝贵的参考资料。ACM竞赛旨在...

    HDU-2000-2099.rar_hdu

    4. **图论**:包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)等。2101-2150号题目可能会涉及图的建立和分析,如网络流问题、旅行商问题等...

Global site tag (gtag.js) - Google Analytics