Robort In Maze问题

Robort in maze问题

自从用Evernote来学习,记笔记,blog上好久没有学习痕迹了。废话少说,来看题目吧!这是一个广搜(Breadth Fisrst Search)比较基础的题。
Q:有一个矩形的房间,覆盖着广场砖,瓷砖颜色有红,黑两种。一个人站在一个黑色的瓷砖上,他可以从现在站的瓷砖搬到四个相邻的瓷砖,即上,下,左,右。规则是,他不能再红色瓷砖上移动,他只能在黑色瓷砖上移动。
编写程序统计黑色瓷砖的块儿数,他可以达到通过重复上述动作。
input:包含多组测试实例,包含两个数据w,h;w和h是瓷砖的数量在x,-y方向的行和列数,(0< w,h<=20),定义如下:
“.”一个黑色的瓷砖
“#”一个红色的瓷砖
“@”一个机器人在一个黑色瓷砖上(一个测试数据仅出现一个)
output:对于每个数据集,你的程序应该输出一行,包含了黑色瓷砖的数量可以到达从最初的瓷砖(包括自己)
测试用例:
6 9
….#.
…..#
……
……
……
……
……
#@…#
.#..#.
11 9
.#………
.#.#######.
.#.#…..#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#…….#.
.##########
………..
Sample Output:
45
59
C++实现源代码:
#include< stdio.h>
#include< stdio.h>
#include< string.h>
#include< iostream>
#include< queue>
#include< algorithm>
using namespace std;
struct node{
int node_x;
int node_y;
};
node cur,dfs; //dfs为下一个要搜索的点
const int MAX_SIZE=100;

char map[MAX_SIZE][MAX_SIZE];
int mark[MAX_SIZE][MAX_SIZE];
queue<node> q;
node  direction[4];
int main(){
    int num_row,num_col;
    int count_step=0,flag1=0,flag2=0;
    direction[0].node_x=-1; //上
    direction[0].node_y=0;
    direction[1].node_x=1;  //下
    direction[1].node_y=0;  
    direction[2].node_x=0;  //左
    direction[2].node_y=-1;
    direction[3].node_x=0;  //右
    direction[3].node_y=1;
    while(scanf("%d%d",&num_col,&num_row)!=EOF){
    if(num_row==0||num_col==0)  
        break;
    getchar();
    count_step=0;
    memset(mark,0,sizeof(mark));
    for(int i=0;i<num_row;i++){ //initialize the map array
        for(int j=0;j<num_col;j++){
            scanf("%c",&map[i][j]);
            if(map[i][j]=='@'){
                flag1=i;
                flag2=j;
                count_step=1;   
                mark[i][j]=1;
            }
        }
        getchar();
    }
    while(!q.empty()){
        q.pop();
    }
    cur.node_x=flag1;
    cur.node_y=flag2;
    q.push(cur);
    while(!q.empty()){
     cur=q.front();
     q.pop();
    dfs.node_x=cur.node_x+direction[i].node_x;            dfs.node_y=cur.node_y+direction[i].node_y;        
    if(dfs.node_x<0||dfs.node_x>num_row||dfs.node_y<0||dfs.node_y>num_col){   //搜索越界
                continue;   
            }
            if(map[dfs.node_x][dfs.node_y]=='#'){
                //do nothing
                continue;
            }
            if(mark[dfs.node_x][dfs.node_y]==1){
                continue;
            }
            if(map[dfs.node_x][dfs.node_y]=='.'&&mark[dfs.node_x][dfs.node_y]==0){
                mark[dfs.node_x][dfs.node_y]=1;
                count_step+=1;
                q.push(dfs);
            }

        }
    }
    printf("%d",count_step);
}
return 0;
}

ps:该题是一个很典型的bfs的练习题,注意测试实例给的是先输入的是col,后输入的是row,不然test输出会有问题,我就在这儿等了好久才看出来。

文章原创,转载请标明出处Robort In Mazehttp://blog.csdn.net/u013295579/article/details/50038245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值