#include <iostream>
#include <string>
#include <stdio.h>
using namespace std; int Map[1001][1001],vis[1001][1001];
int stx,sty,enx,eny,n,m,flag;
int xx,yy,turn,k,i,j;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};//两个数组表示四个方向 void DFS(int x,int y,int turn,int k)//k表示转弯的方向
{
if(flag) return;
if(turn>2)return;
if(turn==2)
{
if(x!=enx&&y!=eny) return; //不在同一直线上
if(x!=enx){ //如果仅仅是列方向上相同,判断当前点和终点的趋势
if(x-enx>0&&k!=1) return;
if(x-enx<0&&k!=0) return;}
if(y!=eny){ //不在同一列上
if(y-eny>0&&k!=3) return;
if(y-eny<0&&k!=2) return;}
//判断如果转了两个弯,
//然后起始点是否朝着终点运动
}
if(turn<=2&&x==enx&&y==eny)
{
flag=1;
return;
} for(i=0;i<4;i++) //四个方向的运动
{
int xx=x+dx[i]; int yy=y+dy[i];
if(!vis[xx][yy]&&(!Map[xx][yy]||(xx==enx&&yy==eny))){//如果没被访问过并且满足1.(此点非0) 2.(已经是终点)两个条件中一个
//说明符合
if(i!=k&&k!=-1) turn++; //所以此时只要判断转的方向i不同于k,既又转了弯,k!=-1只是用来判断第一次
vis[xx][yy]=1;
DFS(xx,yy,turn,i);
vis[xx][yy]=0; //如果回溯回来,要把标记的点还原
if(i!=k&&k!=-1) turn--;
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)&&n||m)
{
for( i = 0; i <= m + 1; i++)
for( j = 0; j <= n + 1; j++)
vis[i][j] = -1; //起初把外围一圈标记为-1
// memset(vis,-1,sizeof(vis));
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&Map[i][j]);
vis[i][j]=0;
}
int T;
scanf("%d",&T);
while(T--)
{
flag=0;
scanf("%d%d%d%d",&stx,&sty,&enx,&eny); //输入起始,终点坐标
if(stx!=enx||sty!=eny) //在起始和终点不同的情况下来判断,不过我觉得貌似是多余的。。。
if(Map[stx][sty]>0&&Map[stx][sty]==Map[enx][eny])//如果坐标大于0,说明不是道路
{
vis[stx][sty]=1;
DFS(stx,sty,0,-1);
vis[stx][sty]=0; //测试数据有好几组吧,所以每次要重新还原
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}

上面的是WA代码

//解题报告

//题目是hdu 1175

//题意大概是一个棋盘,给出起始和终点,然后判断是否能消去,思路很明确,用深搜写

//从题目给出的条件来看,主要在一个转弯问题上和搜索判断的思路上,最后测试数据的时候,都过了,但是提交都WR。。。汗

AC代码:

#include <stdio.h>
#include <string.h>
#define max_size 1005
int num[max_size][max_size], visited[max_size][max_size], index_i, index_j, flag, n, m;
int a[4][2] =
{
1, 0,
-1, 0,
0, 1,
0,-1
};
void dfs(int x, int y, int turn, int index) {
if(flag)
return;
//违背规则的
if(turn > 2)
return;
if(turn == 2) {
//不在同一直线
if(x != index_i && y != index_j)
return;
//在同一列,运动方向不是往目标移动
if(x != index_i)
if(x - index_i > 0 && index != 1 || x - index_i < 0 && index != 0)
return;
//在同一行,运动方向不是往目标移动
if(y != index_j)
if(y - index_j > 0 && index != 3 || y - index_j < 0 && index != 2)
return;
}
//满足条件的
if(turn <= 2 && x == index_i && y == index_j) {
flag = 1;
return;
}
for(int i = 0; i < 4; ++i)
{
int nx = x + a[i][0], ny = y + a[i][1];
if(!visited[nx][ny] && (!num[nx][ny] || nx == index_i && ny == index_j))
{
if(i != index && index != -1)
turn++;
visited[nx][ny] = 1;
dfs(nx, ny, turn, i);
visited[nx][ny] = 0;
if(i != index && index != -1)
turn--;
}
}
}
int main() {
while(scanf("%d%d", &n, &m) && n || m) {
for(int i = 0; i <= n + 1; ++i)
for(int j = 0; j <= m + 1; ++j)
visited[i][j] = -1;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j) {
scanf("%d", &num[i][j]);
visited[i][j] = 0;
}
int Q;
scanf("%d", &Q);
while(Q--) {
int start_i, start_j;
scanf("%d%d%d%d", &start_i, &start_j, &index_i, &index_j);
flag = 0;
if(start_i != index_i || start_j != index_j)
if(num[start_i][start_j] == num[index_i][index_j] && num[start_i][start_j] > 0) {
visited[start_i][start_j] = 1;
dfs(start_i, start_j, 0, -1);
visited[start_i][start_j] = 0;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
}

hdu 1175的更多相关文章

  1. HDU(1175),连连看,BFS

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...

  2. hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...

  3. hdu 1175 连连看 DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...

  4. Hdu 1175 连连看(DFS)

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...

  5. hdu 1175(BFS&DFS) 连连看

    题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...

  6. HDU 1175 连连看(超级经典的bfs之一)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

  7. hdu 1175 连连看 (深搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以 ...

  8. HDU - 1175 连连看 【DFS】【BFS】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路 这种题一想到就用搜索, 但是内存是32m 用 bfs 会不会MLE 没错 第一次 BFS的 ...

  9. hdu 1175冒牌连连看

    #include <bits/stdc++.h> using namespace std; const int N = 1005; int arr[N][N]; int vis[N][N] ...

随机推荐

  1. InstallShield安装包中集成第三方安装包的方案选择[转]

      我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项. 第三方安装包的介质类型有很多,主要有:单独的一个Setup.exe,单独的一个msi包, ...

  2. Nginx源码研究八:nginx监听socket实现流程

    前面描述了nginx系统分析nginx的配置文件,初始化模块相关参数的过程,这里利用nginx监听socket的实现过程,做一次完整的回顾 1.首先,nginx启动的main函数中,会先初始化cycl ...

  3. postgres常用类型

    数值类型 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字节 常用的整数 -2147483648 到 +2147483647 ...

  4. PHP之路——Mysql多表查询

    select a.id,a.`name` AS '姓名',b.`subject`,c.`achievement` from aaa AS a left join ccc AS c on a.id=c. ...

  5. 打patch p0 p1区别

    如何使用patch 对于一个patch文件,有两种常用使用方法: 1.代码:cat new-patch | patch -p0 2.代码:patch -p0 < new-patch   patc ...

  6. POJ2242 The Circumference of the Circle(几何)

    题目链接. 题目大意: 给定三个点,即一个任意三角形,求外接圆的周长. 分析: 外接圆的半径可以通过公式求得(2*r = a/sinA = b/sinB = c/sinC),然后直接求周长. 注意: ...

  7. BZOJ 1028 [JSOI2007]麻将

    1028: [JSOI2007]麻将 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1270  Solved: 576[Submit][Status][ ...

  8. 【转】(DT系列四)驱动加载中, 如何取得device tree中的属性

    原文网址:http://www.cnblogs.com/biglucky/p/4057488.html 本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属 ...

  9. HDOJ(HDU) 1708 Fibonacci String

    Problem Description After little Jim learned Fibonacci Number in the class , he was very interest in ...

  10. K - Rochambeau - poj2912(类似食物链)

    一群小孩玩一个简单石头布布游戏,这些小孩会分成三组(组内可能没有人)+一个自由人(比翻译成裁判合理多了),同一组的小孩只会出同一种手势(不会变的),不过裁判可以出任意的手势,这些小孩能就会相互猜拳玩, ...