连连看

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. selector + drawable 多状态图形

    select_drawble.xml<?xml version="1.0" encoding="utf-8"?> <selector xmln ...

  2. 爬虫之重要的requests模块

    一 . requests模块 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在爬虫领域中占据着半 ...

  3. 更新TP-LINK路由器的外网IP到花生壳动态IP解析

    ------------------------------------------------------------------------------- 以下内容可能还是存在问题,等之后有时间再 ...

  4. appium不支持Android7.0系统设备解决办法

    1. 找到appium的安装目录下的adb.js文件. 2. 打开adb.js,手动修改该文件下的内容: Adb.prototype.getPIDsByName=function(name,cb){ ...

  5. SDUT OJ 河床

    河床 Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 地理学家们经常要对一段河流进行测量分析.他们从上游开始向下游方向等距离地选择 ...

  6. Html+CSS3技术实现动画、天气图标动态效果 效果很酷

    1. [代码][CSS]代码    <svg    version="1.1"    id="sun"    class="climacon c ...

  7. JS工具函数汇总

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

  8. 疑难杂症:“代理 XP”组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 来启用“代理 XP”。

    “代理 XP”组件已作为此服务器安全配置的一部分被关闭.系统管理员可以使用 sp_configure 来启用“代理 XP”.有关启用“代理 XP”的详细信息,请参阅 SQL Server 联机丛书中的 ...

  9. struts2标签(转)

    Struts2 标签库讲解   要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可: <%@ taglib prefix="s" uri="/str ...

  10. 【LeetCode】Reverse Words in a String 反转字符串中的单词

    一年没有管理博客园了,说来实在惭愧.. 最近开始刷LeetCode,之前没刷过,说来也实在惭愧... 刚开始按 AC Rates 从简单到难刷,觉得略无聊,就决定按 Add Date 刷,以后也可能看 ...