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数字表示),输入棋盘上的任意两个左标,判断这两个坐标对应的图案是否 ...
随机推荐
- ELK日志收集系统搭建
架构图 ELK 架构图:其中es 是集群,logstash 是单节点(猜想除非使用nginx对log4j的网络输出分发),kibana是单机(用不着做成集群). 1.拓扑图 2.logstash ...
- Feature Selection 其一 —— Filter Approach
这一个部分都将只涉及到选择特征的某个子集的方法,将高纬度的特征空间映射到低维度空间的方法(如PCA)都不会涉及到. 一. 单变量 优点:运算速度快,独立于分类器 缺点:忽略的特征之间的联系,忽略了与分 ...
- POJ 之 WERTYU
WERTYU Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8371 Accepted: 4007 Descriptio ...
- join()方法作用
当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1 废话不多说看代码: package com.toov5.thread; public class JoinThreadT ...
- Hadoop- Hadoop环境搭建
Windows下Hadoop的安装 准备工具:64位的JDK,Hadoop安装包(我使用的是2.6.1) JDK下载地址 官网: http://www.oracle.com/technetwork/j ...
- javascript(5)
(1)数组的细节: 基本用法 var 数组名=[元素值,元素值...]; 元素的值可以是任意类型. 数组是引用类型. js里的引用. 在函数参数列表中,如果传入的是基本类型,那 按值传递.如果传入的是 ...
- memcached高可用
http://sourceforge.net/projects/repcached/ memcached-1.2.8-repcached-2.2.tar.gz tar zxvf memcached-1 ...
- win32com操作word(2):常用用法
一.对象的位置关系: 1.Range属性位于(部分): Selection__Section__Cell__Paragraph__Table__Bookmark__Comment__Row__List ...
- codeforces 660D D. Number of Parallelograms(计算几何)
题目链接: D. Number of Parallelograms time limit per test 4 seconds memory limit per test 256 megabytes ...
- UNR #1 火车管理
很简单 用一个线段树维护 1.答案 2.当前栈顶是什么时候push进来的 然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个 就可以了 询问直接在线段树上询问,修改在两棵 ...