USACO-Section2.1 The Castle
来源:互联网 发布:经济数据查询 编辑:程序博客网 时间:2024/06/11 01:58
2017-8-3
题目描述
知道城堡有多少个房间,每个房间有多大把一面单独的墙(指两个单位间的墙)拆掉以形成一个更大的房间
解答
代码写的好长...
代码
/*ID: 18795871PROG: castleLANG: C++*/#include<iostream>#include<cstring>#include<fstream>using namespace std;const int N = 50;ifstream fin("castle.in");ofstream fout("castle.out");struct{ bool d,x,n,b; int x1,x2,y1,y2,a;}s[N+2][N+2];int r,c;int m,cnt,sum;bool f[N+1][N+1];void init(){ //根据所给条件判断哪里有墙 int t; fin>>c>>r; for (int i=1;i<=r;i++){ for (int j=1;j<=c;j++){ fin>>t; switch(t){ //零的时候全为默认值 case(1): s[i][j].x=true; break; case(2): s[i][j].b=true; break; case(4): s[i][j].d=true; break; case(8): s[i][j].n=true; break; case(3): s[i][j].x=true; s[i][j].b=true; break; case(5): s[i][j].x=true; s[i][j].d=true; break; case(6): s[i][j].b=true; s[i][j].d=true; break; case(9): s[i][j].x=true; s[i][j].n=true; break; case(10): s[i][j].b=true; s[i][j].n=true; break; case(12): s[i][j].d=true; s[i][j].n=true; break; case(7): s[i][j].x=true; s[i][j].b=true; s[i][j].d=true; break; case(11): s[i][j].x=true; s[i][j].b=true; s[i][j].n=true; break; case(13): s[i][j].x=true; s[i][j].d=true; s[i][j].n=true; break; case(14): s[i][j].b=true; s[i][j].d=true; s[i][j].n=true; break; case(15): s[i][j].b=true; s[i][j].d=true; s[i][j].x=true; s[i][j].n=true; } } }}bool con(int i,int j){ //是否越界 if (i>r||j>c||i<1||j<1) return false; return true;}void dfs(int i,int j){ //深搜求出连通的房间数以及每个房间相应格数 if (!s[i][j].b&&con(i-1,j)&&!f[i-1][j]){ f[i-1][j]=true; cnt++; dfs(i-1,j); } if (!s[i][j].n&&con(i+1,j)&&!f[i+1][j]){ f[i+1][j]=true; cnt++; dfs(i+1,j); } if (!s[i][j].d&&con(i,j+1)&&!f[i][j+1]){ f[i][j+1]=true; cnt++; dfs(i,j+1); } if (!s[i][j].x&&con(i,j-1)&&!f[i][j-1]){ f[i][j-1]=true; cnt++; dfs(i,j-1); }}void cal(){ //a用来确定是否在同一房间内 for (int i=1;i<=r;i++){ for (int j=1;j<=c;j++){ if (f[i][j]){ if (!s[i][j].x1&&!s[i][j].x2&&!s[i][j].y1&&!s[i][j].y2){ s[i][j].a=sum; } if (s[i][j].d&&!s[i][j].x1){ s[i][j].x1=cnt; //东面对应房间的格子数 } if (s[i][j].x&&!s[i][j].x2){ s[i][j].x2=cnt; //西面对应房间的格子数 } if (s[i][j].n&&!s[i][j].y2){ s[i][j].y2=cnt; //南面对应房间的格子数 } if (s[i][j].b&&!s[i][j].y1){ s[i][j].y1=cnt; //北面对应房间的格子数 } } } }}void res(){ //求出结果 int p,q,m=0; char ch; for (int j=1;j<=c;j++){ for (int i=r;i>0;i--){ if (s[i][j].b){ if (s[i][j].a!=s[i-1][j].a&&s[i][j].y1+s[i-1][j].y2>m){ m=s[i][j].y1+s[i-1][j].y2; p=i;q=j;ch='N'; } } if (s[i][j].d){ if (s[i][j].a!=s[i][j+1].a&&s[i][j].x1+s[i][j+1].x2>m){ m=s[i][j].x1+s[i][j+1].x2; p=i;q=j;ch='E'; } } } } fout<<m<<endl<<p<<" "<<q<<" "<<ch<<endl;}int main(){ init(); m=0;sum=0; memset(f,false,sizeof(f)); for (int i=1;i<=r;i++){ for (int j=1;j<=c;j++){ if (!f[i][j]){ f[i][j]=true; cnt=1; dfs(i,j); m=max(m,cnt); sum++; cal(); } } } fout<<sum<<endl; fout<<m<<endl; res(); return 0;}
阅读全文
0 0
- USACO-Section2.1 The Castle
- USACO-Section2.1 The Castle[bfs]
- USACO-Section2.1 The Castle【深度优先搜索】
- USACO-Section2.1 The Castle [搜索][深度优先搜索]
- USACO 2.1.1The Castle
- [USACO 2.1.1] The Castle
- USACO 2.1.1The Castle
- USACO 2.1.1 The Castle
- USACO-2.1.1- The Castle
- USACO 2.1 The Castle (castle)
- USACO 2.1.1The Castle城堡
- USACO-cha2-sec2.1 The Castle
- USACO:2.1.1 The Castle 城堡
- The Castle(USACO 2.1.1)
- 【图论】【USACO】The Castle
- usaco-the castle
- USACO Chapter2 The Castle
- USACO:PROB The Castle
- 《tensorflow实战》注释源码版
- java final关键字
- POJ 1827 Bunch Of Monsters(贪心)
- test
- 使用Jenkins进行持续集成
- USACO-Section2.1 The Castle
- ORACLE 某表执行SQL历史,Java 调用历史SQL
- hdu6069
- 支付宝SDK出现的问题---缺少签名参数 无效签名
- springMVC 对参数为null或参数不为null的处理
- PyCharm下载安装
- 开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)
- shiro获取登录前被拦截地址 (个人备份)
- C/S VS B/S