深搜代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAXN 26//地图的最大宽和高
char map[MAXN][MAXN];//地图数组
bool book[MAXN][MAXN];//标记数组
int nex[4][2] = { {0, -1}, {1, 0}, {0, 1}, {-1, 0} };//上下左右的移动
int W, H;//W是地图的宽度,H是地图的长度
int max_num = 0;//遍历到的格子的个数
using namespace std;
void dfs(int x, int y);
int main(void)
{
while (scanf_s("%d%d", &W, &H) != EOF && W + H)
{
int start_x, start_y;//记录@的位置
max_num = 0;
memset(book, 0, sizeof(book));
//初始化max_num和book
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
{
cin >> map[i][j];
if (map[i][j] == '@')
{
start_x = i;
start_y = j;
map[i][j] == '.';
}
}//导入整个地图
dfs(start_x, start_y);//进入深搜
printf("%d\n", max_num + 1);
}
return 0;
}
void dfs(int x, int y)
{
for (int i = 0; i < 4; i++)
{
int tx = x + nex[i][0];
int ty = y + nex[i][1];//在下一步试探,不行就下一个
if (tx >= 0 && tx < H&&ty >= 0 && ty < W&&map[tx][ty] == '.' && !book[tx][ty])
{//如果下一个位子在框内并且是没有走过的路那就递归下一层
book[tx][ty] = true;//给走过的路标记
dfs(tx, ty);//进入下一层
max_num++;//这里可以直接增加是因为如果走过了就不会再走了
//book[tx][ty] = false;这里的标记别取消别取消
}
}
}
广搜代码
/*
通过广搜来实现
*/
#include <iostream>
#include <stdio.h>
#include <queue>//队列
#define MAXN 26
char map[MAXN][MAXN];
int nex[4][2] = { {0, -1}, {1, 0}, {0, 1}, {-1, 0} };//方向数组
struct Node
{//位置结构
int x;
int y;
};
using namespace std;
queue <Node>que;//定义一个存储点类型的队列容器
int main(void)
{
int W, H;
while (scanf_s("%d%d", &W, &H) != EOF && W + H)
{
Node temp;//定义一个队列
int coun = 0;
//que.emplace();
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
{//输入地图
cin >> map[i][j];
if (map[i][j] == '@')
{
map[i][j] = '#';//我之前写的是map[i][j] = '.',这个bug我TM找了两个小时,感谢VS强大的调试功能
temp.x = i;
temp.y = j;//把第一个点压入队列
que.push(temp);
}
}
while (!que.empty())
{
//int tx;
//int ty;
for (int i = 0; i < 4; i++)
{
int tx = que.front().x + nex[i][0];
int ty = que.front().y + nex[i][1];//以最靠前的点为中心向四方遍历
if (tx >= 0 && tx < H&&ty >= 0 && ty < W&&map[tx][ty] == '.')
{//如果该点在范围之内,且没有被遍历到
temp.x = tx;
temp.y = ty;
map[tx][ty] = '#';//打上走过的印记
que.push(temp);//压入队列
}
}
que.pop();//弹出第一个元素
coun++;//证明已经走过了这个位置
}
printf("%d\n", coun);
}
return 0;
}