题目描述:寻宝
有这么一块神奇的矩形土地,为什么神奇呢?因为上面藏有很多的宝藏。该土地由N*M个小正方形土地格子组成,每个小正方形土地格子上,如果标有“E”,则表示该格可以通过;如果标有“X”,则表示该格不能通过。现在你处于其中的一格上,用“P”表示,你只能向与你所在格子相邻的上、下、左、右四个方向移动,当然如果你即将移向的格子上标有“X”,则不能通过。现在的任务是:如果你能从起点通过每个用“E”标示的格子一次且仅一次,则你将寻宝成功,否则则失败。
输入
输入包括如下几部分。 第一部分:输入两个数N(1<=N<=6)和M(1<=M<=6),分别表示该土地的行和列。 第二部分:输入一个只能由“P”、“X”、“E”构成的N*M大小的矩阵,且“P”只能出现一次,代表你当前所在位置。
输出
如果能寻宝成功,输出“YES”;否则输出“NO”。
样例输入
2 2 PE ES 4 4 PXEE EXEE EEEE EEEE
样例输出
NO YES
思路:简单的DFS。
之前总是AC不正确是因为初始化只在程序进入的时候初始化了一次,后面没有所以结果错了,下次记得初始化!!!!!
// 寻宝.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" //没有AC的原因是flag只是初始化了一次!!!!! #include <iostream> #include <cstring> using namespace std; int n, m, num,sr,sl, flag, vis[10][10], dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 }; char map[10][10]; void DFS(int x, int y, int step) { if (step == num) { flag = 1; return; } if (flag) return; for (int i = 0; i < 4; i++) { int nx = dir[i][0] + x; int ny = dir[i][1] + y; if (nx >= 0 && ny >= 0 && nx < n && ny < m && !vis[nx][ny] && map[nx][ny]=='E') { vis[x][y] = 1; DFS(nx, ny, step + 1); vis[x][y] = 0; } } } int main() { while (cin>>n>>m) { memset(vis, 0, sizeof(vis)); memset(map, '