hdu 1175
#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的更多相关文章
- HDU(1175),连连看,BFS
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...
- hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...
- hdu 1175 连连看 DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...
- Hdu 1175 连连看(DFS)
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...
- hdu 1175(BFS&DFS) 连连看
题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...
- HDU 1175 连连看(超级经典的bfs之一)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others) ...
- hdu 1175 连连看 (深搜)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以 ...
- HDU - 1175 连连看 【DFS】【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路 这种题一想到就用搜索, 但是内存是32m 用 bfs 会不会MLE 没错 第一次 BFS的 ...
- hdu 1175冒牌连连看
#include <bits/stdc++.h> using namespace std; const int N = 1005; int arr[N][N]; int vis[N][N] ...
随机推荐
- (转载)图解Linux系统的系统架构
我以下图为基础,说明Linux的架构(architecture).(该图参考<Advanced Programming in Unix Environment>) 最内层是硬件,最外层是用 ...
- YesFInder - Web File Manager 网页文件管理系统
开发原由: 原来想找一下实现可视化图片上传程序,先找了ckfinder,发现居然是收费的,而且用起来也不顺手,于是想能不能自己写一个.想到这就立即动手,花2天时间完成初步功能,然后再花了3天完善.目前 ...
- [ JS 进阶 ] 如何改进代码性能 (3)
原文链接 总结一下 1.减少操作dom的次数 2.需要多次使用某全局变量的时候,将其赋给一个局部变量,避免重复查找 3.优化循环 4.多用逗号和直接赋值的方式来var,减少工厂方式和构造函数方式创建对 ...
- jQuery之异步Ajax请求使用
$.ajax({type:'',data:'',async:''...}) 参数: 1.cache: true缓存页面 false 不缓存页面 (默认: true,dataType为script和js ...
- javascript获取对象宽度和高度
标签元素的宽高值获取//绝对宽度Obj.offsetWidth//绝对高度Obj.offsetHeight 以下是获取窗口对象的宽高值.clientHeight 获取对象的高度,不计算任何边距.边 ...
- Erget 显示对象
核心显示类: 类 描述 DisplayObject 显示对象基类,所有显示对象均继承自此类 Bitmap 位图,用来显示图片 Shape 用来显示矢量图,可以使用其中的方法绘制矢量图形 TextFie ...
- AnimationDrawable 资源
AnimationDrawable代表一个动画,Android 既支持传统的逐帧动画(类 似于电影方式,一张图片.一张图片地切换),也支持通过平移.变换计算出来的补间动画. 下面以补间动画为例来介绍如 ...
- How to Install Linux, Apache, MySQL, PHP (LAMP) stack on CentOS 6 【Reliable】
About LAMP LAMP stack is a group of open source software used to get web servers up and running. The ...
- Bit,Bytes,KB,MB,GB,TB,PB,EB,ZB,YB
Bit,Bytes,KB,MB,GB,TB,PB,EB,ZB,YB 汉字字符 2字节英文字符 1字节中文标点 2字节英文标点 1字节一个字节就是一个八位二进制数啊,2就是00000010,4就是000 ...
- cf591A Wizards' Duel
A. Wizards' Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...