(step4.2.2)hdu 1312(Red and Black——BFS)
2013-08-15 21:04
375 查看
题目大意:给一个w*h的黑白棋盘,一个人站在某个黑色点上,并且这个人只能访问和他相邻的
*黑色点,求这个人能一共能访问多少个点
解题思路:BFS
1)scanf(" %c",&map[i][j]);。%c前面的空格用于去除一个字符前面的空白(包括回车、空格。。。)
.这是要特别注意的
代码如下:
/*
* 1312_2.cpp
*
* Created on: 2013年8月15日
* Author: Administrator
* 加油。。。我的女神是章泽天。。。。
*/
#include <iostream>
#include <queue>
using namespace std;
/**
* 用sx、sy来保存起始点的坐标
* n: 行数
* m: 列数
*
*/
int sx,sy,n,m;
//用来保存输入的字符
char map[21][21];
const int maxn = 100;
bool visited[maxn][maxn];//用来标记是否访问过
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//点的移动方向
struct State{
int x ;//(x,y)用于表示第x行第y列
int y;
int step_counter;
};
bool checkState(State st){
//!!一定要将这里的x,y与坐标系上的x,y区分开
if((!visited[st.x][st.y])&&(map[st.x][st.y] == '.')&&(st.x >= 1 && st.x <= n && st.y >= 1 && st.y <= m)){
return true;
}
return false;
}
void bfs(){
queue<State> q;
State st,now,next;
st.x = sx;
st.y = sy;
int num = 0;
q.push(st);
memset(visited,0,sizeof(visited));
visited[st.x][st.y] = 1;
while(!q.empty()){
num++;
now = q.front();
int i;
for( i = 0 ; i < 4 ; ++i){
next.x = now.x + dir[i][0];
next.y = now.y + dir[i][1];
if(checkState(next)){
q.push(next);
visited[next.x][next.y] = 1;
}
}
q.pop();
}
printf("%d\n",num);
}
int main(){
while(scanf("%d%d",&m,&n)!=EOF,n||m){
int i,j;
for(i = 1; i <= n ; ++i){
for( j = 1 ; j <= m ; ++j){
scanf(" %c",&map[i][j]);//这里的%c前面一定要有一个空格,用于去除一个字符前面的所有空格。否则会出错。。。。
if(map[i][j] == '@'){
sx = i;
sy = j;
}
}
}
bfs();
}
}
*黑色点,求这个人能一共能访问多少个点
解题思路:BFS
1)scanf(" %c",&map[i][j]);。%c前面的空格用于去除一个字符前面的空白(包括回车、空格。。。)
.这是要特别注意的
代码如下:
/*
* 1312_2.cpp
*
* Created on: 2013年8月15日
* Author: Administrator
* 加油。。。我的女神是章泽天。。。。
*/
#include <iostream>
#include <queue>
using namespace std;
/**
* 用sx、sy来保存起始点的坐标
* n: 行数
* m: 列数
*
*/
int sx,sy,n,m;
//用来保存输入的字符
char map[21][21];
const int maxn = 100;
bool visited[maxn][maxn];//用来标记是否访问过
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//点的移动方向
struct State{
int x ;//(x,y)用于表示第x行第y列
int y;
int step_counter;
};
bool checkState(State st){
//!!一定要将这里的x,y与坐标系上的x,y区分开
if((!visited[st.x][st.y])&&(map[st.x][st.y] == '.')&&(st.x >= 1 && st.x <= n && st.y >= 1 && st.y <= m)){
return true;
}
return false;
}
void bfs(){
queue<State> q;
State st,now,next;
st.x = sx;
st.y = sy;
int num = 0;
q.push(st);
memset(visited,0,sizeof(visited));
visited[st.x][st.y] = 1;
while(!q.empty()){
num++;
now = q.front();
int i;
for( i = 0 ; i < 4 ; ++i){
next.x = now.x + dir[i][0];
next.y = now.y + dir[i][1];
if(checkState(next)){
q.push(next);
visited[next.x][next.y] = 1;
}
}
q.pop();
}
printf("%d\n",num);
}
int main(){
while(scanf("%d%d",&m,&n)!=EOF,n||m){
int i,j;
for(i = 1; i <= n ; ++i){
for( j = 1 ; j <= m ; ++j){
scanf(" %c",&map[i][j]);//这里的%c前面一定要有一个空格,用于去除一个字符前面的所有空格。否则会出错。。。。
if(map[i][j] == '@'){
sx = i;
sy = j;
}
}
}
bfs();
}
}
相关文章推荐
- HDU1312 Red and Black(BFS)(step与sum)
- HDU 1312 Red and Black(BFS,DFS)
- HDU 1312 Red and Black(BFS)
- hdu 1312 Red and Black DFS搜索 or BFS搜索
- Hdu 1312 Red and black(BFS)
- HDU 1312 Red and Black DFS(深度优先搜索) 和 BFS(广度优先搜索)
- HDU 1312 Red and Black(BFS)
- hdu 1312 red and black BFS
- HDU1312 Red and Black (DFS || BFS)
- HDU 1312 Red and Black --- 入门搜索 BFS解法
- HDU 1312 Red and Black(并查集或者BFS)
- hdu 1312 Red and Black (dfs+bfs)
- hdu 1312 Red and Black(BFS水题)
- HDU 1312 Red and Black(基础bfs或者dfs)
- HDU - 1312 : Red and Black(dfs、bfs)
- hdu 1312 Red and Black(bfs实现)
- HDU 1312 Red and Black(BFS,DFS)
- HDU 1312Red and Black(简单搜索 bfs或dfs)
- HDU 1312 Red and Black-dfs&bfs-(分块)
- poj 1979 &&hdu 1312Red and Black (bfs)