51nod_棋盘行走 ( 深度优先搜索 )


题目连接

题意

给一个 n*m 的棋盘, 棋盘每个格子颜色都是一个大写字母,
以一个格子为起点, 每次只能走上下左右四个方向, 并且每个格子只能走一次,
要求 :
至少经过四个颜色相同的不同格子最终走回起点
若可以输出 Yes, 否则 No.

题解

直接 dfs, 一直忘记回溯起点, wa到蹦! 唉…
后来考虑了下, 的确完全没必要用一个数组来只标记一个起点, 实在是非常浪费,
完全可以用 vis[i][j] = -1 来标记起点,
再或者用两个变量记录起点横纵坐标, 在递归出口的时候判断下即可 …
不过为了强迫症式的整洁, 我就不改了 ^ _ ^

就当复习了 dfs 了吧, 顺便用一用 get 到的新技能, 不用方向数组来枚举方向, emm, 很巧妙啊, 见方向遍历方式二

代码

方向遍历方式一

#include <bits/stdc++.h>
using namespace std; 

const int MAXN = 55;

int n, m;
char a[MAXN][MAXN];
bool vis[MAXN][MAXN];
bool isStratPos[MAXN][MAXN];

bool ans = false; 

int nxt[4][2] = {
      
    {
    0, 1 },
    {
    1, 0 }, 
    {
    0, -1 },
    {
    -1, 0 } };

void dfs ( char ch, int x, int y, int len ) {
   

	if ( ans ) return;

    for ( int k = 0; k < 4; ++k ) {
   
        int tx = x+nxt[k][0], ty = y+nxt[k]
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值