练习二 1009 连连看问题
2016-04-13 14:18
232 查看
简单题意:
规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。连线不能从外面绕过去的,br>玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去
思路:
首先明确这是一个所搜索的问题,因只要找到解决的方法即可,就考虑用广度搜索。
建立一个队列,用方向数组将方向记录下来。在运用广度搜索的办法将每一级的所有可能情况压入队列,在判断是否到达最终条件即可
代码如下:
感想:
对于这个题,刚开始我居然用的深搜做的,坑了自己一把。广搜找到结果即可,深搜可找到所有结果。
ACID:00747221
规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。连线不能从外面绕过去的,br>玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去
思路:
首先明确这是一个所搜索的问题,因只要找到解决的方法即可,就考虑用广度搜索。
建立一个队列,用方向数组将方向记录下来。在运用广度搜索的办法将每一级的所有可能情况压入队列,在判断是否到达最终条件即可
代码如下:
#include <iostream> #include <queue> #include <cstring> using namespace std; struct node { int x, y; int t, d; }; queue<node> q; int n, m, map[1002][1002], prove; int visit[1002][1002][4]; int qry, sx, sy, ex, ey; int dx[4] = {0, -1, 0, 1}; int dy[4] = {1, 0, -1, 0}; int check(int x, int y) { if(x < 1 || x > n || y < 1 || y > m)//方向数组记录方向 return 0; else return 1; } void bfs() { while(!q.empty()) q.pop(); memset(visit, 0, sizeof(visit)); node s, e; s.x = sx; s.y = sy; s.t = 0; s.d = -1; q.push(s); while(!q.empty()) { s = q.front(); q.pop(); if(s.t > 2) continue; if(s.x == ex && s.y == ey)//最终成立的条件 { prove = 1; cout << "YES" << endl; break; } for(int i = 0; i < 4; i++) { e.x = s.x + dx[i]; e.y = s.y + dy[i]; if(!check(e.x, e.y) || visit[s.x][s.y][i]) continue; if( map[e.x][e.y] == 0 || (e.x == ex && e.y == ey) ) { if(s.d == -1 || i == s.d) { e.d = i; e.t = s.t; q.push(e); visit[s.x][s.y][i] = 1; } else { e.d = i; e.t = s.t + 1; q.push(e); visit[s.x][s.y][i] = 1; } } } } } int main() { while(cin >> n >> m) { if(!n && !m) break; int i=1; int j=1; for(i = 1; i <= n; i++) for( j = 1; j <= m; j++) cin >> map[i][j]; cin >> qry; for(i=1; i<= qry;i++) { cin >> sx >> sy >> ex >> ey; prove = 0; if(map[sx][sy] == map[ex][ey] && map[sx][sy] != 0) 4000 bfs(); if(!prove) cout << "NO" << endl; } } return 0; }
感想:
对于这个题,刚开始我居然用的深搜做的,坑了自己一把。广搜找到结果即可,深搜可找到所有结果。
ACID:00747221
相关文章推荐
- 关于At least one JAR was scanned for TLDs yet contained no TLDs.问题的解决
- Java String类的秘密
- OpenStack及其构成简介1
- Java基础练习选择题(4)
- Oracle:PL/SQL Developer 创建一个新用户
- iOS开发-GCD 常见用法一(延迟执行)
- apache配置中ProxyPassReverse指令的含义
- 谈谈多态
- lightoj 1043 - Triangle Partitioning 公式
- 蓝桥杯—— 算法训练 数对
- MD5加密的实现
- 怎样用Java代码来把SSL的证书自己主动导入到Java的秘钥存储文件(keystore)
- 如何更改Win32生成exe文件的图标
- 设置Button的字体颜色状态选择器
- Redis主从设置配置
- Swift编程中的switch...case语句实例解析
- 《iOS Human Interface Guidelines》——Modal View
- 笔记(4/11-4/12) java基础
- Apache与Tomcat联系及区别
- Leaf编程问题汇总#1