您的位置:首页 > 其它

(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();
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: