HDU-3912 Turn Right 简单搜索

2024-06-16 16:32
文章标签 简单 搜索 hdu turn right 3912

本文主要是介绍HDU-3912 Turn Right 简单搜索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接


主要是题意有点不好理解  

题目大意:给你副图 有点个出口 问从这两出口中一进一出(比如出口A,B 可以从A进去B出去走一遍,再从B进去A出来走一遍)  

能走的条件为:第一不能有墙,第二,能往右走往右走,不然往前走,再不行就往左走,最后再往后走,问最终能否走遍图中全部格子。

起初不懂怎么存储原图,还是新大神指点迷津

递归DFS会爆栈

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 605;
const int inf = 1<<30;
int n,m,ans;
int xs[] = {0,-1,0,1};   //右上左下
int ys[] = {1,0,-1,0};
int r = 0,u = 1,l = 2,d = 3;
struct node
{bool wall[4];
}map[maxn][maxn];
bool vis[maxn][maxn];
void DFS( int x,int y,int dir )
{int d;while( 1 ){if( flag || x < 0 || x >= n )break;vis[x][y] = true;for( int i = -1;i <= 2; i ++ ){d = (dir+i+4)%4;if( map[x][y].wall[d] ){x+=xs[d];y+=ys[d];dir = d;break;}}}
}
void fun()
{for( int i = 0; i < n; i ++ )for( int j = 0; j < m; j ++ )if( !vis[i][j] ){puts("NO");return;}puts("YES");}
void init()
{memset(vis,0,sizeof(vis));for( int i = 0; i <= n; i ++ )for( int j = 0; j <= m; j ++ )for( int k = 0; k < 4; k ++ )map[i][j].wall[k] = 0;
}
int main()
{//freopen("data.txt","r",stdin);   int cas,s,e,temp;scanf("%d",&cas);while( cas -- ){scanf("%d%d%d%d",&n,&m,&s,&e);init();for( int i = 0; i < n-1; i ++ ){for( int j = 0; j < m-1; j ++ ){scanf("%d",&temp);if( temp )map[i][j].wall[r] = map[i][j+1].wall[l] = 0;elsemap[i][j].wall[r] = map[i][j+1].wall[l] = 1;}for( int j = 0; j < m; j ++ ){scanf("%d",&temp);if( temp )map[i][j].wall[d] = map[i+1][j].wall[u] = 0;elsemap[i][j].wall[d] = map[i+1][j].wall[u] = 1;}}for( int j = 0; j < m-1; j ++ ){scanf("%d",&temp);if( temp )map[n-1][j].wall[r] = map[n-1][j+1].wall[l] = 0;elsemap[n-1][j].wall[r] = map[n-1][j+1].wall[l] = 1;}map[0][s].wall[u] = 1;map[n-1][e].wall[d] = 1;DFS( 0,s,d );DFS( n-1,e,u);fun();}return 0;
}





这篇关于HDU-3912 Turn Right 简单搜索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066954

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直