hdu 1175 连连看(BFS的搜索方向与效率问题)

题目链接,点我点我!

之所以写这篇解题报告,主要是讨论一下BFS的优先搜索方向与效率问题,从Time Limits(超过10000ms)到100ms,如此大的一个跨度,深深感到自己之前写的程序有多渣,所以记录下来作为经验积累。

下面请看代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <climits>
using namespace std;
#define maxn 1005
int map[maxn][maxn];
bool vis[maxn][maxn][4];//因为数字不大,开三维数组记录方向,否则代码会很冗杂
int dx[4] = { 0,-1,0,1 };//方向向量,具体根据题目数据判断
int dy[4] = { 1,0,-1,0 };//大家可以改变搜索顺序感受一下运行时间差
int n, m;
int k, sx, sy, ex, ey;//这里尽可能不用y1.用y1在VS2012会报错,重定义,但是oj上能过,很奇怪
int flag;//做标记

struct node {
	int x, y;
	int dir;//方向
	int turn;//记录转弯次数
};

bool judge(int x, int y) {//判断约束条件
	if (x < 1 || x > n || y < 1 || y > m)
		return false;
	return true;
}

queue<node>q;
void bfs() {
	while (!q.empty())//清空队列
		q.pop();
	memset(vis, 0, sizeof(vis));
	node s, e;
	s.x = sx;
	s.y = sy;
	s.dir = -1;
	s.turn = 0;
	q.push(s);
	while (!q.empty()) {
		s = q.front();
		q.pop();
		if (s.turn > 2)//先判断题目中约束条件
			continue;
		if (s.x == ex&&s.y == ey) {//目标条件
			flag = 1;
			printf("YES\n");
			break;
		}
		for (int i = 0; i < 4; i++) {//这个循环看不懂的去画图
			e.x = s.x + dx[i];
			e.y = s.y + dy[i];
			if (!judge(e.x, e.y)||vis[s.x][s.y][i])//如果把s换成e,就是Time limits!
				continue;
			if (map[e.x][e.y] == 0 || (e.x==ex&&e.y==ey)) {
				if (s.dir == -1 || s.dir == i) {
					e.dir = i;
					e.turn = s.turn;
					q.push(e);
					vis[s.x][s.y][i] = 1;
				}
				else {
					e.dir = i;
					e.turn = s.turn + 1;
					q.push(e);
					vis[s.x][s.y][i] = 1;
				}
			}
		}
	}
}

int main() {
	while (~scanf("%d%d", &n, &m)){
		if (n == 0 && m == 0)
			break;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				scanf("%d", &map[i][j]);
		scanf("%d", &k);
		while (k--) {
			scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
			flag = 0;
			if(map[sx][sy]==map[ex][ey]&&map[sx][sy]!=0)//还是判断约束条件
				bfs();
			if (!flag)
				printf("NO\n");
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值