soj 4396 bfs

背景:周赛h题。

学习:1.用queue写的bfs,主要注意的是,每一个生成后的子数据都要被标记为不能走了,否则将会越产生越多情况而超内存。

2.调试出现异常一定是代码问题,不要盲目以为编译器问题,认真一句一句的读代码查错为好。

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
struct pal{
	int x;
	int y;
};
char map[202][202];
int main(void){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,m;
		scanf("%d %d",&n,&m);
		memset(map,'#',sizeof(map));
		for(int i=0;i<n;i++)        //read the map.
		    scanf("%s",map[i]);
		queue<pal> q;
		pal key,end;
		int fq=0,sq=0;              //fq mean the quantity of the father elemence of queue.
		for(int i=0;i<n;i++){       //read the start and end place.
			for(int j=0;j<m;j++){
				if(map[i][j]=='m'){
				   key.x=i;
				   key.y=j;
				   q.push(key);
				   fq++;
				}
				if(map[i][j]=='p'){
				   end.x=i;
				   end.y=j;
				}
			}
		}
		int step=0;
		int ways[4][2]={{1,0},{-1,0},{0,1},{0,-1}} ;
			while(1){
				if(q.front().x==end.x&&q.front().y==end.y) break;
				for(int ii=0;ii<4;ii++)           //make the front elemence walk to four directions.
				{
					if(q.front().x+ways[ii][0]>=0&&q.front().y+ways[ii][1]>=0&&(map[q.front().x+ways[ii][0]][q.front().y+ways[ii][1]]=='*'||map[q.front().x+ways[ii][0]][q.front().y+ways[ii][1]]=='p')){
						key.x=q.front().x+ways[ii][0];
						key.y=q.front().y+ways[ii][1];
						map[key.x][key.y]='#';    //mark the son data,and avoid using it again.
						q.push(key);
						sq++;
					}
				}
				fq--;
				q.pop();
				if(fq==0){
					step++;
					if(sq!=0){                     //still have sons,so do the next.
						fq=sq;
						sq=0;
					}else{
						step=-1;
						break;
					}
				}
			}
			printf("%d\n",step);
	}
	return 0;
}
时间: 2024-10-10 00:34:05

soj 4396 bfs的相关文章

HDU - 4396 More lumber is required (BFS 最短路)

题目大意:有一个需要采集K跟木头,然后到达点T,现在他从S点出发,路上有N个节点,M条边,只要经过1条边,就可以得到10根木头,问需要花费多少时间才能完成任务 解题思路:木头最多只有500根,且每次收集10跟,最多也只需要收集50次就可以,而且节点最多只有5000个,所以直接暴力BFS即可 #include <cstdio> #include <cstring> #include <queue> using namespace std; #define N 5010 #

Soj题目分类

-----------------------------最优化问题------------------------------------- ----------------------常规动态规划  SOJ1162 I-Keyboard  SOJ1685 Chopsticks SOJ1679 Gangsters SOJ2096 Maximum Submatrix  SOJ2111 littleken bg SOJ2142 Cow Exhibition  SOJ2505 The County

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou

POJ3967Ideal Path[反向bfs 层次图]

Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colo

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================