hdu1175 连连看
连连看
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
Input输入数据有多组。每组数据的第一行有两个正整数n,m(0<n<=1000,0<m<1000),分别表示棋盘的行数与列数。在接下来的n行中,每行有m个非负整数描述棋盘的方格分布。0表示这个位置没有棋子,正整数表示棋子的类型。接下来的一行是一个正整数q(0<q<50),表示下面有q次询问。在接下来的q行里,每行有四个正整数x1,y1,x2,y2,表示询问第x1行y1列的棋子与第x2行y2列的棋子能不能消去。n=0,m=0时,输入结束。
注意:询问之间无先后关系,都是针对当前状态的!
Output每一组输入数据对应一行输出。如果能消去则输出"YES",不能则输出"NO"。
Sample Input
3 4
1 2 3 4
0 0 0 0
4 3 2 1
4
1 1 3 4
1 1 2 4
1 1 3 3
2 1 2 4
3 4
0 1 4 3
0 2 4 1
0 0 0 0
2
1 1 2 4
1 3 2 3
0 0
Sample Output
YES
NO
NO
NO
NO
YES
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,map[][],x2,y2;
int e[][]={{-,},{,},{,-},{,}};
bool flag,vis[][];
bool ok(int x,int y){
if(x>=&&x<=n&&y>=&&y<=m&&map[x][y]==&&!vis[x][y])return ;
return ;
}
void dfs(int x,int y,int cnt,int pre){
if(cnt>=)return;
if(flag)return;
if(x==x2&&y==y2){flag=;return;}
if(!ok(x,y))return;
if(cnt==) {
if(!((pre==&&y2==y&&x2<x)||(pre==&&y2==y&&x2>x)||(pre==&&y2<y&&x2==x)||(pre==&&y2>y&&x2==x)))
return;
}
vis[x][y]=;
for(int i=;i<;i++){
int xx=x+e[i][],yy=y+e[i][];
if(i==pre)dfs(xx,yy,cnt,pre);
else dfs(xx,yy,cnt+,i);
}
vis[x][y]=;
}
int main(){
while(){
scanf("%d%d",&n,&m);
if(n==&&m==)return ;
for(int i=;i<=n;i++)for(int j=;j<=m;j++)scanf("%d",&map[i][j]);
int q;scanf("%d",&q);
int x1,y1;
while(q--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if((x1==x2&&y1==y2)||map[x1][y1]!=map[x2][y2]||map[x1][y1]==||map[x2][y2]==){
printf("NO\n");continue;
}
flag=;
memset(vis,,sizeof(vis));
vis[x1][y1]=;
for(int i=;i<;i++){
int xx=x1+e[i][],yy=y1+e[i][];
dfs(xx,yy,,i);
}
if(flag){printf("YES\n");continue;}
else printf("NO\n");
}
}
}
dfs+剪枝
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,map[][],x2,y2;
int e[][]={{-,},{,},{,-},{,}};
int visited[][];
struct node{
int x,y,d,cnt;
}cur,nxt;
queue<node>q;
bool ok(int x,int y){
if(x>=&&x<=n&&y>=&&y<=m&&map[x][y]==)return ;
return ;
}
void bfs(){
while(!q.empty()){
cur=q.front();q.pop();
int x=cur.x,y=cur.y;
if(x==x2&&y==y2){printf("YES\n");return;}
for(int i=;i<;i++){
nxt.x=cur.x+e[i][];
nxt.y=cur.y+e[i][];
nxt.d=i;nxt.cnt=cur.cnt;
if(nxt.d!=cur.d&&cur.d!=-)nxt.cnt++;
if(nxt.x<||nxt.x>n||nxt.y<||nxt.y>m||nxt.cnt>)continue;
if(nxt.x==x2&&nxt.y==y2){
printf("YES\n");
return;
}
if(map[nxt.x][nxt.y])continue;
if(nxt.cnt<visited[nxt.x][nxt.y]){
visited[nxt.x][nxt.y]=nxt.cnt;
q.push(nxt);
}
}
}
printf("NO\n");
}
int main(){
freopen("Soda.txt","r",stdin);
while(){
scanf("%d%d",&n,&m);
if(n==&&m==)return ;
for(int i=;i<=n;i++)for(int j=;j<=m;j++)scanf("%d",&map[i][j]);
int qu;scanf("%d",&qu);
int x1,y1;
while(qu--){
while(!q.empty())q.pop();
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1==x2&&y1==y2){
printf("NO\n");continue;
}
if(!map[x1][y1]||!map[x2][y2]||(map[x1][y1]!=map[x2][y2])){
printf("NO\n");continue;
}
cur.x=x1,cur.y=y1,cur.d=-,cur.cnt=;
q.push(cur);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
visited[i][j]=0x7fffffff;
bfs();
}
}
return ;
}
bfs不知道哪里写错了啊啊啊
hdu1175 连连看的更多相关文章
- hdu1175连连看
Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经 ...
- HDU1175 连连看(DFS)
Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经 ...
- HDU1175 连连看(bfs) 2016-07-24 13:27 115人阅读 评论(0) 收藏
连连看 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通 ...
- hdu1175连连看(dfs+细节)
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu1175 连连看(bfs疯狂MLE和T,遂考虑dfs+剪枝)
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1175/ 题目大意就是给出地图,上面有若干的数,相当于连连看,给了q个查询,问给出的两个位置的数能否在两次转弯以内 ...
- HDU1175:连连看(搜索)
传送门 题意 给定一个n*m的矩阵,询问q次,两个方块是否能被消掉,弯折次数不超过两次 分析 这题写了有一个下午,思路很简单,但是有很多trick,(唉),我还是太弱 trick 初始判断:1.两点不 ...
- 连连看[HDU1175]
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 传智播客--XAML布局--连连看界面(小白内容)
一个简单的10*10连连看,有100个格子,可以在XAML里面用ColumnDefinition和RowDefinition各写10组,但是这样效率会很慢,因此,可以采用动态生成的方式进行. publ ...
- 连连看游戏(dfs)【华为上机题目】
1 连连看游戏 今天同学给我做了道编程题目,貌似是华为的,题目描述大概是这样的: 给定一个连连看棋盘,棋盘上每个点都有各种图案(用非0数字表示),输入棋盘上的任意两个左标,判断这两个坐标对应的图案是否 ...
随机推荐
- Java基础:hashCode与equals个人学习记录
摘要: 本文主要记录本人对hashCode和对equals两个知识点的学习过程. 从学生时期初学java,就知道hashCode和equals这两个方法,工作中equals方法使用也是特别频繁,要说e ...
- Android4.4 GPS框架分析【转】
本文转载自:http://blog.csdn.net/junzhang1122/article/details/46674569 GPS HAL层代码在目录trunk/Android/hardware ...
- win 10 安装.msi 程序出现the error code is 2503
解决方法: C:\Windows\temp文件夹的权限不够,需要给其更高权限 右键temp文件夹 点击属性进入属性对话框 组或用户名的里面的All APPLICATION PACKAGES和所有受限制 ...
- python关于文件路径和文件名的操作
os.path.abspath(path) #返回绝对路径(包含文件名的全路径) os.path.basename(path) —— 去掉目录路径获取文件名 os.path.dirname(path) ...
- BZOJ 1572 [Usaco2009 Open]工作安排Job:贪心 + 优先队列【先放再更新】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1572 题意: 有n个工作,每个工作有一个截止日期dead[i]和收益pay[i]. 完成一 ...
- listen 69
Today Is Unlucky for People Who Have Bad Luck Today If you have Paraskevidekatriaphobia, today is no ...
- Ice php配置
1) Removed the php extension directories and recompiled apache/PHP2) Rebooted the machine.3) I remov ...
- bzoj 1049: 数字序列 dp
题目大意: 给定一个长度为n的整数序列.在改变的数最小的和改变的幅度最小的前提下把它变成一个单调严格上升的序列.求改变的最小的数和这个幅度. 题解: (貌似以前考试考过这道题) 其实这道题就是两道题拼 ...
- 解析Monte-Carlo算法(基本原理,理论基础,应用实践)
引言 最近在和同学讨论研究Six Sigma(六西格玛)软件开发方法及CMMI相关问题时,遇到了需要使用Monte-Carlo算法模拟分布未知的多元一次概率密度分布问题.于是花了几天时间,通过查询相关 ...
- bzoj 2865 字符串识别 —— 后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2865 唯一出现的子串就是每个后缀除去和别的后缀最长的 LCP 之外的前缀: 所以用这个更新一 ...