城堡(简单但费时)

来源:互联网 发布:js设置时间间隔 编辑:程序博客网 时间:2024/05/01 03:05

1

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int xiang[2500],k1=1;
int cha[55][55][4];
int k=1;
int map[55][55];
void zhaofang(int z,int y);
struct aaa{int hx;int hy;char wei;int mianji;};
aaa x1;
int main()
{
    freopen("castle.in","r",stdin);
    freopen("castle.out","w",stdout);
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
          int a;
          cin>>a;
          for(int k=0;k<4;k++){
                cha[i][j][k]=a%2;
                a/=2;
            }
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
    {
        if(map[i][j]==0){
                zhaofang(i,j);
                xiang[k++]=k1;
                k1=1;
        }
    }
    k--;
    cout<<k<<endl;
    int max1=0;
    for(int i=1;i<=k;i++)
        max1=max(max1,xiang[i]);
    cout<<max1<<endl;
    aaa x1;
    x1.mianji=0;
    for(int j=1;j<=m;j++)
      for(int i=n;i>=1;i--){
      if(cha[i][j][1]==1)
            {
                if(map[i][j]!=map[i-1][j])
                {if(xiang[map[i][j]]+xiang[map[i-1][j]]>x1.mianji){
                x1.hx=i;
                x1.hy=j;
                x1.wei='N';
                x1.mianji=xiang[map[i][j]]+xiang[map[i-1][j]];
            }
            else if(xiang[map[i][j]]+xiang[map[i-1][j]]==x1.mianji)
            {
                if(x1.wei=='E')
                {
                    if(j<=x1.hy){x1.hx=i;
                x1.hy=j;
                x1.wei='N';
                x1.mianji=xiang[map[i][j]]+xiang[map[i-1][j]];}
                }
            }
            }
            }
    if(cha[i][j][2]==1&&map[i][j]!=map[i][j+1])
        if(xiang[map[i][j]]+xiang[map[i][j+1]]>x1.mianji)
    {
                x1.hx=i;
                x1.hy=j;
                x1.wei='E';
                x1.mianji=xiang[map[i][j]]+xiang[map[i][j+1]];
    }
    }
    cout <<x1.mianji<<endl;
    cout<<x1.hx<<" "<<x1.hy<<" "<<x1.wei<<endl;
    return 0;
}
void zhaofang(int z,int y)
{
    map[z][y]=k;
    for(int i=0;i<=3;i++)
    {
        if(cha[z][y][i]==0){
            if(i==0&&map[z][y-1]==0){k1++;zhaofang(z,y-1);}
            else if(i==1&&map[z-1][y]==0){k1++;zhaofang(z-1,y);}
            else if(i==2&&map[z][y+1]==0){k1++;zhaofang(z,y+1);}
            else if(i==3&&map[z+1][y]==0){k1++;zhaofang(z+1,y);}
        }
    }
}

 

 

 

 

 

#include <iostream> 
#include <algorithm> 
#include <cstdio> 

using namespace std; 
int mp[55][55]; 
int room[2555]; 
int roomnum[55][55]; 
int sum, size, m, n; 
bool v[55][55]; 
void dfs(int i, int j) 

    v[i][j] = true; 
    roomnum[i][j] = sum; 
    size++; 
    if((mp[i][j] & 1) == 0 && j > 1 && !v[i][j - 1]) dfs(i, j - 1); 
    if((mp[i][j] & 2) == 0 && i > 1 && !v[i - 1][j]) dfs(i - 1, j); 
    if((mp[i][j] & 4) == 0 && j < m && !v[i][j + 1]) dfs(i, j + 1); 
    if((mp[i][j] & 8) == 0 && i < n && !v[i + 1][j]) dfs(i + 1, j); 

int main() 

    freopen("castle.in","r",stdin); 
    freopen("castle.out","w",stdout); 
    int i, j; 
    scanf("%d%d", &m, &n); 
    for(i = 1; i <= n; i++) 
    { 
        for(j = 1; j <= m; j++) 
        { 
            scanf("%d", &mp[i][j]); 
        } 
    } 
    sum = 0; 
    for(i = 1; i <= n; i++) 
    { 
        for(j = 1; j <= m; j++) 
        { 
            if(!v[i][j]) 
            { 
                size = 0; 
                dfs(i, j); 
                room[sum++] = size; 
            } 
        } 
    } 
    int mx = -1; 
    for(i = 0; i < sum; i++) 
    { 
        mx=max(mx,room[i]);
    } 
    printf("%d\n%d\n", sum, mx); 
    mx = -1; 
    char c; 
    int r, l; 
    for(j = 1; j <= m; j++) 
    { 
        for(i = n; i >= 1; i--) 
        { 
            if((mp[i][j] & 2) != 0 && i > 1) 
            { 
 
                if(roomnum[i][j] != roomnum[i - 1][j]) 
                { 
                    int tmp = room[roomnum[i][j]] + room[roomnum[i - 1][j]]; 
                    if(tmp > mx) 
                    { 
                        r = i; 
                        l = j; 
                        c = 'N'; 
                        mx = tmp; 
                    } 
                } 
            } 
            if((mp[i][j] & 4) != 0 && j < m) 
            { 
 
                if(roomnum[i][j] != roomnum[i][j + 1]) 
                { 
                    int tmp = room[roomnum[i][j]] + room[roomnum[i][j + 1]]; 
                    if(tmp > mx) 
                    { 
                        r = i; 
                        l = j; 
                        c = 'E'; 
                        mx = tmp; 
                    } 
                } 
            } 
        } 
    } 
    printf("%d\n%d %d %c\n", mx, r, l, c); 
    return 0; 
}

0 0
原创粉丝点击