poj_1979 Red and Black

来源:互联网 发布:protty网络验证 编辑:程序博客网 时间:2024/06/06 20:49

这道题是一道搜索题,我用了两种方法都过了,一种是记忆化搜索,另一种是bfs,记忆化搜索用了0MS,bfs用了32MS,我也是新手想用两种方法来解决这道题,我觉得这还是一道比较经典的入门题,很经典,希望大家都能多用几种方法来解决问题,重要的是思维的发散!

这道题的意思就是找从‘@’开始能到的所有‘.’的总和,包括‘@’本身!


//这是记忆化搜索,一直到找不到满足题意为止!
#include <iostream>using namespace std;int m,n;char map[100][100];int dfs(int i,int j){    if(i>=0&&i<n&&j>=0&&j<m)    {        if(map[i][j]=='#')            return 0;        map[i][j]='#';        return 1+dfs(i+1,j)+dfs(i-1,j)+dfs(i,j+1)+dfs(i,j-1);    }    return 0;}int main(){    int i,j;    while(cin>>m>>n,m+n)    {        for(i=0; i<n; i++)            for(j=0; j<m; j++)                cin>>map[i][j];        for(i=0; i<n; i++)            for(j=0; j<m; j++)            {                if(map[i][j]=='@')                    cout<<dfs(i,j)<<endl;            }    }    return 0;}


//这是bfs,用队列做,定义一个结构体作为横纵坐标,先把@找到,入队记录下来,然后出队,把记录下来的坐标的上下左右都入队,再重复下去!!!
#include <iostream>#include <queue>#include <cstring>using namespace std;char map[100][100];int flag[100][100];int add_x[]= {0,0,1,-1};int add_y[]= {1,-1,0,0};int n,m;int border(int i,int j){    if(i>=0&&i<m&&j>=0&&j<n)        return 1;    else        return 0;}struct node{    int x,y;};node temp,sign,t;int dfs(){    int count=1;    queue<node>s;    flag[t.x][t.y]=1;    s.push(t);    while(!s.empty())    {        temp=s.front();        s.pop();        for(int i=0; i<4; i++)        {            if(!flag[temp.x+add_x[i]][temp.y+add_y[i]]&&border(temp.x+add_x[i],temp.y+add_y[i]))            {                sign.x=temp.x+add_x[i];                sign.y=temp.y+add_y[i];                flag[sign.x][sign.y]=1;                s.push(sign);                count++;            }        }    }    cout<<count<<endl;}int main(){    int i,j;    while(cin>>n>>m,m+n)    {        for(i=0; i<m; i++)            for(j=0; j<n; j++)                cin>>map[i][j];        for(i=0; i<m; i++)            for(j=0; j<n; j++)            {                if(map[i][j]=='@')                {                    t.x=i;                    t.y=j;                }                if(map[i][j]=='#')                    flag[i][j]=1;                if(map[i][j]=='.')                    flag[i][j]=0;            }            dfs();    }    return 0;}




0 0