用深搜和广搜两种方法解题---黑色格子
2016-04-24 23:49
232 查看
给一个字符矩阵,“.”代表黑色格子,“#”代表红色格子,有一个起点“@”,它属于黑色格子,一个人从起点出发,只能走黑色格子,并且只能上下左右走,不能对角线走,问这个人能走到的黑色格子有多少个。输出个数。输入W,H,代表有W列,H行,然后输入一个字符矩阵,输出能走到的最多的黑色格子的个数,包括起点。
广度优先搜索:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int num;
char map[25][25];
int visited[25][25];
int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};
void DFS(int x, int y, int n, int m)
{
int mx, my;
for(int i = 0; i<4; i++)
{
mx = x+dir[i][0];
my = y+dir[i][1];
if(mx>=1 && mx<=n && my>=1 && my<=m && !visited[mx][my] && map[mx][my]=='.')
{
visited[mx][my] = 1;
num++;
DFS(mx, my, n, m);
}
}
}
int main()
{
int n, m, x, y;
while(scanf("%d%d", &m, &n)!=EOF && (n || m))
{
num = 1;
memset(visited, 0, sizeof(visited));
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
cin>>map[i][j];
if(map[i][j] == '@')
{
x = i;
y = j;
visited[x][y] = 1;
}
}
}
DFS(x, y, n, m);
4000
printf("%d\n", num);
}
return 0;
}
深度优先搜索:
#include <stdio.h>
#include <queue>
using namespace std;
#define MAXN 25
bool vis[MAXN][MAXN];
char map[MAXN][MAXN];
int W, H, result, dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
struct Tile { //
以状态(棋子坐标)为结点
int x, y;
}tile[MAXN*MAXN];
queue <Tile> q;
bool reachable(Tile next)
{
return map[next.x][next.y] != '#' && next.x >= 1 && next.x <= W && next.y >= 1 && next.y <= H;
}
void bfs()
{
Tile cur, next;
while (!q.empty())
{
cur = q.front();
q.pop();
result++;
for (int i = 0; i < 4; ++i)
{
next.x = cur.x + dx[i];
next.y = cur.y + dy[i];
if (reachable(next) && !vis[next.x][next.y])
{
vis[next.x][next.y] = true;
q.push(next);
}
}
}
}
int main()
{
int i, j;
Tile start;
while (scanf("%d%d", &W, &H), W && H)
{
result = 0;
memset(vis, false, sizeof(vis)); //
数据初始化
for (i = 1; i <= H; ++i)
for (j = 1; j <= W; ++j)
{
scanf(" %c", &map[j][i]); // x y
if (map[j][i] == '@')
{
start.x = j;
start.y = i;
vis[j][i] = true;
q.push(start);
}
}
bfs();
printf("%d\n", result);
}
return 0;
}
广度优先搜索:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int num;
char map[25][25];
int visited[25][25];
int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};
void DFS(int x, int y, int n, int m)
{
int mx, my;
for(int i = 0; i<4; i++)
{
mx = x+dir[i][0];
my = y+dir[i][1];
if(mx>=1 && mx<=n && my>=1 && my<=m && !visited[mx][my] && map[mx][my]=='.')
{
visited[mx][my] = 1;
num++;
DFS(mx, my, n, m);
}
}
}
int main()
{
int n, m, x, y;
while(scanf("%d%d", &m, &n)!=EOF && (n || m))
{
num = 1;
memset(visited, 0, sizeof(visited));
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=m; j++)
{
cin>>map[i][j];
if(map[i][j] == '@')
{
x = i;
y = j;
visited[x][y] = 1;
}
}
}
DFS(x, y, n, m);
4000
printf("%d\n", num);
}
return 0;
}
深度优先搜索:
#include <stdio.h>
#include <queue>
using namespace std;
#define MAXN 25
bool vis[MAXN][MAXN];
char map[MAXN][MAXN];
int W, H, result, dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
struct Tile { //
以状态(棋子坐标)为结点
int x, y;
}tile[MAXN*MAXN];
queue <Tile> q;
bool reachable(Tile next)
{
return map[next.x][next.y] != '#' && next.x >= 1 && next.x <= W && next.y >= 1 && next.y <= H;
}
void bfs()
{
Tile cur, next;
while (!q.empty())
{
cur = q.front();
q.pop();
result++;
for (int i = 0; i < 4; ++i)
{
next.x = cur.x + dx[i];
next.y = cur.y + dy[i];
if (reachable(next) && !vis[next.x][next.y])
{
vis[next.x][next.y] = true;
q.push(next);
}
}
}
}
int main()
{
int i, j;
Tile start;
while (scanf("%d%d", &W, &H), W && H)
{
result = 0;
memset(vis, false, sizeof(vis)); //
数据初始化
for (i = 1; i <= H; ++i)
for (j = 1; j <= W; ++j)
{
scanf(" %c", &map[j][i]); // x y
if (map[j][i] == '@')
{
start.x = j;
start.y = i;
vis[j][i] = true;
q.push(start);
}
}
bfs();
printf("%d\n", result);
}
return 0;
}
相关文章推荐
- 一 简单工厂模式
- protobuf的安装和使用
- MD5Helper
- Linux常用命令(一)
- 流媒体选择Nginx是福还是祸?
- 20145301 实验三 "敏捷开发与XP实践"
- AJAX笔记-基本使用
- Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object
- 被问到“你现在的薪水是多少时”,该如何回答?
- 被问到“你现在的薪水是多少时”,该如何回答?
- Windows+Git+TortoiseGit+COPSSH安装图文教程+个人的一些补充
- LeetCode 28. Implement strStr()
- 2_索引与查询优化
- 深入浅出的理解框架(Struts2、Hibernate、Spring)与 MVC 设计模式
- Swift3.0 / swift2.3中dispatch_group的使用
- 分布式计算——实现简单的浏览器和web服务器
- LeetCode 008
- 翁恺老师零基础学JAVA语言第五周数组--投票程序例题-个人理解
- JAVA中的File类,I/O流基础
- iOS开发系列--Objective-C之类和对象