#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. 延迟加载并渐现内容的jquery插件lazyFade

    http://www.jqcool.net/demo/201412/jquery-lazyfade/

  2. thinkphp excel txt文件上传实现

    <?php/************************************************************************************** ***  ...

  3. 使用bootstrap模态框实现浮动层

    authour: 陈博益 updatetime: 2015-04-22 06:52:15 friendly link: http://v3.bootcss.com/javascript/#modals ...

  4. KEIL C51高级编程

    第一节 绝对地址访问C51提供了三种访问绝对地址的方法: 1. 绝对宏:在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE.XBYTE.PWORD.DBYTE.CWO ...

  5. java String字符串进行排序

    public String afterSort(String s){        char[] ss = s.toCharArray();        Arrays.sort(ss);       ...

  6. hihocoder1236(北京网络赛J):scores 分块+bitset

    北京网络赛的题- -.当时没思路,听大神们说是分块+bitset,想了一下发现确实可做,就试了一下,T了好多次终于过了 题意: 初始有n个人,每个人有五种能力值,现在有q个查询,每次查询给五个数代表查 ...

  7. RMQ算法讲解

    RMQ算法 引入: 例1.题目描述 输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数之间的最大值.   第一种方法:大暴力之术. 但是……时间复杂度最坏会达到 $O(NM)$,一半 ...

  8. mongodbOperator

    mongodb创建数据库表语句 db.createCollection("CollectionName or tableName"); db.createCollection(&q ...

  9. DAY TRADER

    日内交易是一种交易模式,英文名字是daytrade,主要是指持仓时间短,不留过夜持仓的交易方式.日内交易捕捉入市后能够马上脱离入市成本的交易机会,入市之后如果不能马上获利,就准备迅速离场.因为这种交易 ...

  10. Jenkins,Maven及TestNG在自动化测试的应用(转)

    转自:http://qa.blog.163.com/blog/static/190147002201581634549893/ 希望实现的场景:Jenkins中的Job可针对不同浏览器,不同环境,运行 ...