zoukankan      html  css  js  c++  java
  • [USACO Section 2.1]城堡 The Castle (搜索)

    题目链接


    Solution

    比较恶心的搜索,思路很简单,直接广搜找联通块即可.
    但是细节很多,要注意的地方很多.所以直接看代码吧...

    Code

    #include<bits/stdc++.h>
    int mp[52][52],n,m,cnt;
    int v[52][52],col[52][52];
    int siz[2508],num,maxx,kk;
    struct node{int x,y;};
    struct point{int w,x,y;char ch;}ans[10002];
    bool cmp(point s,point j){
      if(s.w==j.w)
      {
        if(s.y==j.y)
        {
          if(s.x==j.x) return s.ch-'A'>j.ch-'A';
          return s.x>j.x;
        }
        return s.y<j.y;
      }
      return s.w>j.w;}
    using namespace std;
    
    int read()
    {
        char ch=getchar(); int f=1,w=0;
        while(ch<'0'||ch>'9'){ch=getchar();}
        while(ch<='9'&&ch>='0'){w=w*10+ch-'0';ch=getchar();}
        return f*w;
    }
    
    void bfs(int xx,int yy)
    {
         queue<node>q; cnt++;
         q.push((node){xx,yy});
         v[xx][yy]=1;
         while(!q.empty())
         {
            node x=q.front(); q.pop();
            int i=x.x,j=x.y;
            col[i][j]=cnt;
            siz[cnt]++;
            int w=mp[i][j];
            if(!(w>>0&1)) if(j>1&&!v[i][j-1])
            q.push((node){i,j-1}),v[i][j-1]=1;
    
            if(!(w>>1&1)) if(i>1&&!v[i-1][j])
            q.push((node){i-1,j}),v[i-1][j]=1;
    
            if(!(w>>2&1)) if(j<m&&!v[i][j+1])
            q.push((node){i,j+1}),v[i][j+1]=1;
    
            if(!(w>>3&1)) if(i<n&&!v[i+1][j])
            q.push((node){i+1,j}),v[i+1][j]=1;
         }
         maxx=max(maxx,siz[cnt]);
    }
    
    void work(int x,int y)
    {
         for(int i=-1;i<2;i++)
         for(int j=-1;j<2;j++)
         if(abs(i+j)==1)
         if(x+i>0&&x+i<=n)
         if(y+j>0&&y+j<=m)
         if(col[x+i][y+j]!=col[x][y])
         {
              if(siz[col[x+i][y+j]]+siz[col[x][y]]>=kk)
              {
                  kk=siz[col[x+i][y+j]]+siz[col[x][y]];
                  js[x][y]++;
                  ans[++num].w=kk;ans[num].x=x;
                  ans[num].y=y;
                  if(i==1)ans[num].ch='S';
                  if(i==-1)ans[num].ch='N';
                  if(j==1)ans[num].ch='E';
                  if(j==-1)ans[num].ch='W';
              }
         }
    }
    
    int main()
    {
        m=read(); n=read();
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        mp[i][j]=read();
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        if(!v[i][j])
        bfs(i,j);
        cout<<cnt<<endl;
        cout<<maxx<<endl;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        work(i,j);
        sort(ans+1,ans+num+1,cmp);
        cout<<kk<<endl;
    
        int k=1;
        for(int i=2;i<=num;i++)
        {
            if(ans[i].w!=kk)break;
            if(ans[i].y!=ans[i].y&&ans[i-1].x!=ans[i-1].y)break;
            while(ans[i].y==ans[i-1].y)
            i++; k=i;
        }
        cout<<ans[1].x<<' '<<ans[1].y<<' '<<ans[1].ch<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    vscode maven
    clojure + sumblime text SublimeREPL
    .zsh_history
    springboot-自动装配
    任务调度-Quartz
    springcloud alibaba
    canal与kafka的结合使用
    centos7安装Zookeeper
    centos7安装kafka
    vmware+centos7 设置静态ip
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/9630354.html
Copyright © 2011-2022 走看看