I - 红与黑

Posted wgd943

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I - 红与黑相关的知识,希望对你有一定的参考价值。

【题意】仅有两种颜色,红,黑两种瓷砖,我现在只能在相邻黑瓷砖上运动,并且我现在站在黑色瓷砖上,问能够到达好多快瓷砖。输入 0 0 是退出。

【思路】此题是bfs搜索,因为,提到了只能向相邻的黑色瓷砖运动,所以只需要记录我自己可以在队列中push多少次即可,最终答案加1哦,因为要算本身的

【代码】:

技术图片
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;

int W,H;
char mp[21][21];
int vis[21][21];

int fx[4]={0,0,-1,1};
int fy[4]={-1,1,0,0};

struct node{
    int x,y;
}; 
int ans;
int x,y;
bool check(int x,int y){
    //printf("%d %d====
",x,y);
    if(x<H&&x>=0&&y<W&&y>=0){//不能超过边界
        return 1;
    }
    else return 0;
}

int bfs(int x,int y){

    queue<node> q;
    q.push({x,y});
    while(q.size()){
        node now=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nextx=now.x+fx[i];
            int nexty=now.y+fy[i];    
            if(check(nextx,nexty)&&!vis[nextx][nexty]&&mp[nextx][nexty]==.){
                ans++;//只管加就是
                //printf("%d %d---%d %d++++
",nextx,nexty,ans,check(nextx,nexty));
                q.push({nextx,nexty}); 
                vis[nextx][nexty]=1;//走过的点标记,不在走就是
            }
        }
    }
    return ans;
}

int main(){
       ios_base::sync_with_stdio(false);
    cin.tie(0);
    int si,sj;//记录我现在的位置
    while(cin>>W>>H){
        ans=0;
        memset(vis,0,sizeof(vis));
        if(W==0&&H==0) break;
        for(int i=0;i<H;i++){
            for(int j=0;j<W;j++){
                cin>>mp[i][j];
                if(mp[i][j]==@){
                    si=i;
                    sj=j;
                }
            }
        }
        //printf("%d %d-----
",si,sj);
        //bfs(si,sj);
        cout<<bfs(si,sj)+1<<"
";
        
    }
    return 0;
}
View Code

此题很bfs,自己觉得没有太大难度,只是最后加1可能会忽略。

okk....

以上是关于I - 红与黑的主要内容,如果未能解决你的问题,请参考以下文章

[dfs] aw1113. 红与黑(dfs连通性模型+dfs计数方式+模板题)

1113. 红与黑

这个代码片段究竟做了啥?

简单搜索 红与黑:

以下代码片段的算法复杂度

vs 2010代码片段