hdu 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175

和之前的1728类似。就是判断转弯数,建立一个用于记录转弯数的数组。。

还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO。还有就是起点或终点是零这也是不行的,因为0代表没有棋子。。。

还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写。。

错误的地方都写在注释中了。。

代码:

// hdu 1175 bfs 转弯数
//1、起点和终点重合的时候要特殊考虑,这是不能消掉的。。
//2、如果起点或终点之中有一个0,就不能消掉。
//3、 对于turn1数组每次查询之前都要进行初始化。。
#include<cstdio>
#include<queue>
#include<cstring>
#define INF 100000000;
using namespace std;
int n,m;
int sx,sy,ex,ey;
int ok;
int d1[4] = {0,0,1,-1};
int d2[4] = {1,-1,0,0};
int map[1010][1010];
int turn1[1010][1010];
struct state
{
	int x,y;
	int turn;
	int dir;
}cur,next1;
void bfs(state temp)
{
	temp.turn = 0;
	temp.dir = -1;
	turn1[temp.x][temp.y] = 0;
	queue<state> q;
	q.push(temp);
	while(!q.empty())
	{
		cur = q.front();
		q.pop();
		if(cur.x == ex&&cur.y == ey)
		{
			if(cur.turn <= 2)
			{
				ok = 1;
				printf("YES\n");
				return;
			}
		}
		if(cur.turn > 2) continue;
		for(int i = 0;i < 4;i++)
		{
			next1.x = cur.x + d1[i];
			next1.y = cur.y + d2[i];
			next1.dir = i;
			if(next1.x>0&&next1.x<=n&&next1.y>0&&next1.y<=m&&(map[next1.x][next1.y]==0||(next1.x==ex&&next1.y==ey)))
			{                                      //这里要小心 一开始写成(map[next1.x][next1.y]==0||(map[next1.x][next1.y]==map[sx][sy]))
				if(cur.dir!=i && cur.dir!=-1)      //如果两个棋子是被相同数字的棋子挡住就会出现错误的判断
					next1.turn = cur.turn+1;
				else
					next1.turn = cur.turn;
				if(next1.turn <= turn1[next1.x][next1.y])
				{
					turn1[next1.x][next1.y] =next1.turn;
					q.push(next1);
				}
			}
		}
	}
}
int main ()
{
	while(scanf("%d%d",&n,&m)==2 && (n||m))
	{
		for(int i = 1;i <= n;i++)
		for(int j = 1;j <= m;j++)
		{
			scanf("%d",&map[i][j]);
			turn1[i][j] = INF;
		}
		int t;
		scanf("%d",&t);
		while(t--)
		{
			scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
			for(int i = 1;i <= n;i++)
			for(int j = 1;j <= m;j++)
			turn1[i][j] = INF;//此处要记得初始化。。不然WA妥妥的,因为在之前的查询之中已经被破坏
			ok = 0;
			if(map[sx][sy]==map[ex][ey]&&map[sx][sy]*map[ex][ey]!=0&&(sx!=ex||sy!=ey))
			{
				cur.x = sx;
				cur.y = sy;
				bfs(cur);
				if(!ok) printf("NO\n");
			}
			else
			printf("NO\n");
		}
	}
	return 0;
 } 
时间: 2024-10-13 00:32:37

hdu 1175 bfs 转弯题的相关文章

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

hdu 1175(BFS) 连连看

题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜. 与普通的搜索比不同的是要求转折的线不能转折超过两次,就是在结构体中多开一个step(储存转折的次数)和一个dir(记录此刻的方向) 方向初始为-1,当行走一步后的方向与走之前不同的时候,step就应该加一, 然后还要注意的是为了保证得到的是所有的路线中转折次数最小的,这里的visit数组要用来保存每个点的最小转折次数, 所

hdu 1175 bfs+priority_queue

连连看 如上图所示如果采用传统bfs的话,如果按照逆时针方向从(1,1)-->(3,4)搜索,会优先选择走拐四次弯的路径导致ans错误: Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 34028    Accepted Submission(s): 8438 Problem Description "连连看"相信很多

hdu 4474 BFS+思维题

http://acm.hdu.edu.cn/showproblem.php?pid=4474 如果A%n ==B %n  (A<B) 那么A接下来A经若干次填位数使得A'%n==0,这个过程也可以使B'%n==0  但是显然A更小,所以开一个1e4的数组判重 犯得二逼错误: 1.需要记录每一位,不是mod%10就是每一位 2.第一位枚举1~9,但是仍然需要%n 3.必然需要高精度,开始ll  WA到死 #include <cstdio> #include <cstring>

hdu 1312 Red and Black(BFS水题)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9684    Accepted Submission(s): 6021 Problem Description There is a rectangular room, covered with square tiles. Each tile is colore

hdu 1175 dfs

背景:数次超时,数次wa,dfs还是存在代码不规范的情况,什么时候回溯没有考虑清楚.后来看了模板化的搜索写法,发现我一直没有用过visit[M][M]标记访问过的点,而是直接在原图上标记,这样是节约内存但是,容易出错! 思路:这个转向题最大的特点是,创建了一个结构体,即有转向数count,也有上次走来的方向up,一旦up和这次的方向数不一样,count就加一(我的代码少考虑了,起点和终点在同一点的情况,但数据没有这种,所以侥幸过了,要是有这样的数据,得找好久才能找出错点,起点和终点是同一点的情况

【dfs】hdu 1175 连连看

[dfs]hdu 1175 连连看 题目链接:hdu 1175 连连看 题目大意 连连看,问能否成功? 题意很简单,就是我们平时玩的连连看的游戏规则,貌似dfs和bfs都能做,笔者就做了个dfs(好想),超时了好几次,原因是dfs(int d)与终点的d重载矛盾了,所以还是要小心. 说一下思路 神器的剪枝:if(t==2&&x!=c&&y!=d) return;这一部剪枝妙笔回春,9000+MS优化到100+MS啊:如果转了2次,但是目标与当前位置不在同一行或同一列就不满足

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

HDU - 1175 连连看 DFS (记录方向)

连连看HDU - 1175 "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去.不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的.现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过. 玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能