poj 1111(bfs,计算单点周长和四周八个点是否有X)

复制代码
#include<iostream>
#include<cstring> 
#include<queue>
using namespace std;
struct Node{
    int x,y;
    Node(){
        x = 0;
        y = 0;
    }
    Node(int a,int b){
        x = a;
        y = b;
    }
};
int r,c,a,b,data[25][25],dx[] = {-1,0,1},dy[] = {-1,0,1},result;
bool visit[25][25];
void bfs(){
    a--;
    b--; 
    queue<Node>q;
    q.push(Node(a,b));
    visit[a][b] = true;
    for(int i=0;i<3;i++){//计算单点周长 
        for(int j=0;j<3;j++){
            if((i==1&&j==1)||(dx[i]*dy[j]!=0))continue;
            int x = a+dx[i];
            int y = b+dy[j];
            bool flag = false;
            if(x<0||x>=r){
                result++;
                flag = true;
            }
            if(y<0||y>=c){
                result++;
                flag = true;
            }
            if(!flag){
                if(!data[x][y]){
                    result++;
                }
            }
        }
    }
    while(!q.empty()){
        int x = q.front().x;
        int y = q.front().y;
        q.pop();
        for(int i=0;i<3;i++){//计算四周八个点是否有X 
            for(int j=0;j<3;j++){
                if(i==1&&j==1)continue;
                int px = x+dx[i];
                int py = y+dy[j];
                if(px<0||py<0||px>=r||py>=c)continue;
                if(data[px][py]==1&&!visit[px][py]){
                    q.push(Node(px,py));
                    visit[px][py] = true;
                    for(int s=0;s<3;s++){
                        for(int t=0;t<3;t++){
                            int px_s = px+dx[s];
                            int py_t = py+dy[t];
                            if((s==1&&t==1)||(dx[s]*dy[t]!=0))continue;
                            bool flag = false;
                            if(px_s<0||px_s>=r){
                                result++;
                                flag = true;
                            }
                            if(py_t<0||py_t>=c){
                                result++;
                                flag = true;
                            }
                            if(!flag){
                                if(!data[px_s][py_t]){
                                    result++;                                    
                                }
                            }
                        }
                    }
                }
            }
        }
    }
} 
int main(){
    char ch[25];
    while(scanf("%d%d%d%d",&r,&c,&a,&b)==4&&r){
        memset(data,0,sizeof(data));
        memset(visit,false,sizeof visit);
        for(int i=0;i<r;i++){
            scanf("%s",ch);
            for(int j=0;j<c;j++){
                if(ch[j]=='X')data[i][j] = 1;
            }
        }
        result = 0;
        bfs();
        printf("%d\n",result);
    }
    return 0;
}
复制代码

 

posted @   智人心  阅读(32)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示