题目连接
题意
给一个 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]