连连看

HDU - 1175

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

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 连连看的更多相关文章

  1. hdu1175连连看

    Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经 ...

  2. HDU1175 连连看(DFS)

    Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经 ...

  3. HDU1175 连连看(bfs) 2016-07-24 13:27 115人阅读 评论(0) 收藏

    连连看 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通 ...

  4. hdu1175连连看(dfs+细节)

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. hdu1175 连连看(bfs疯狂MLE和T,遂考虑dfs+剪枝)

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1175/ 题目大意就是给出地图,上面有若干的数,相当于连连看,给了q个查询,问给出的两个位置的数能否在两次转弯以内 ...

  6. HDU1175:连连看(搜索)

    传送门 题意 给定一个n*m的矩阵,询问q次,两个方块是否能被消掉,弯折次数不超过两次 分析 这题写了有一个下午,思路很简单,但是有很多trick,(唉),我还是太弱 trick 初始判断:1.两点不 ...

  7. 连连看[HDU1175]

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  8. 传智播客--XAML布局--连连看界面(小白内容)

    一个简单的10*10连连看,有100个格子,可以在XAML里面用ColumnDefinition和RowDefinition各写10组,但是这样效率会很慢,因此,可以采用动态生成的方式进行. publ ...

  9. 连连看游戏(dfs)【华为上机题目】

    1 连连看游戏 今天同学给我做了道编程题目,貌似是华为的,题目描述大概是这样的: 给定一个连连看棋盘,棋盘上每个点都有各种图案(用非0数字表示),输入棋盘上的任意两个左标,判断这两个坐标对应的图案是否 ...

随机推荐

  1. JS性能优化——加载和执行

    JavaScript 在浏览器中的性能,可以认为是开发者所面临得最严重的可用性问题.这个问题因JavaScript的阻塞特性变得复杂, 也就是说当浏览器在执行JavaScript代码时,不能同时做其他 ...

  2. 微信小程序开发:学习笔记[1]——Hello World

    微信小程序开发:学习笔记[1]——Hello World 快速开始 1.前往微信公众平台下载微信开发者工具. 地址:https://mp.weixin.qq.com/debug/wxadoc/dev/ ...

  3. 小程序开发之xxx is not defined

    遇到问题 在小程序开发中直接在函数中调用data中的变量直接赋值给新的变量,就会出现如下错误 VM33895:1 thirdScriptErrorapaymoney is not defined; [ ...

  4. java多线程---基础

    一, java多线程----线程与进程 进程: 程序(任务)的执行过程,拥有资源(共享内存,共享资源)和线程(一个或者多个,至少一个).  例如:打开任务管理器,qq,chrome,都属于进程. 线程 ...

  5. SPOJ - SUBST1 New Distinct Substrings —— 后缀数组 单个字符串的子串个数

    题目链接:https://vjudge.net/problem/SPOJ-SUBST1 SUBST1 - New Distinct Substrings #suffix-array-8 Given a ...

  6. Spring Boot2.0之自定义参数

    自定义参数,把不同环境的配置放到配置文件中去. 不同环境,如何区分配置文件信息,自定义配置文件信息 比如在 application.properties定义个参数 name=toov5 Spring ...

  7. TS流分析

    http://blog.csdn.net/zxh821112/article/details/17587215 一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transpor ...

  8. JS工具函数汇总

    备注:http://phpjs.org/  这个站点把PHP常用的方法用js实现了,推荐一下 1.从数组中随机获取几个不重复项 //从一个给定的数组arr中,随机返回num个不重复项 function ...

  9. php设置文件编码

    <?php @header('Content-type: text/html;charset=UTF-8'); ?>

  10. 改变Ecplise项目窗口字体样式

    Eclipse\plugins\org.eclipse.ui.themes_1.1.1.v20151026-1355\css e4-dark_win.css CTabFolder Tree, CTab ...