[USACO][暴力]The Castle

是语文题(确信)

题意:

给一个数字矩阵代表一个有很多墙壁的屋子,墙壁的包围可以形成一个个房间,输出最大的房间大小、最大房间位置以及房间数目。

思路:

首先M和N容易反,然后就是拆墙找最大房间的时候要先东西找,再南北找。东西中更西的优先,南北的更南的优先。把这里的东西南北映射成i++,i--,j++,j--这样子。

再就是color数组做标号的时候,如果roomNumber从0开始的话,color初始化就要是-1,然后搜索搜到有-1就不找他了。我这里是roomNumber从1开始。同时搜索的时候也要注意判断要不要搜这个点的时候,最好先判断再展开搜索。如果在push的时候判断的话会重复。

最后吐槽一下codeblocks貌似单个文件编译不支持debug,只能靠输出debug,就很容易懒得debug。

设计的话我把房间二维坐标用Room包装了一下方便存取,color数组负责给房间标号染色。深搜的时候迭代的同时也在更新最大面积,记录当前的房间号的面积。

代码:

  1 #include<stdio.h>
  2 #include<bits/stdc++.h>
  3 using namespace std;
  4
  5 struct Room
  6 {
  7     int r,c;
  8     Room(int rr, int cc):r(rr),c(cc){};
  9 };
 10
 11 int M,N;
 12 int roomNum = 1;
 13 int roomArea;
 14 int maxArea;
 15 int room[300][300];
 16 int color[300][300];
 17 int area[300];
 18 void dfs(int r,int c)
 19 {
 20     stack<Room> stk;
 21     stk.push(Room(r,c));
 22     while(!stk.empty())
 23     {
 24         int i=stk.top().r;
 25         int k=stk.top().c;
 26         stk.pop();
 27         //cout<<i<<" "<<k<<" num: "<<roomNum<<endl;
 28         //编号
 29         if(color[i][k] != 0)
 30             continue;
 31         ++roomArea;
 32         color[i][k]=roomNum;
 33         if((room[i][k] & 1) == 0){
 34             stk.push(Room(i,k - 1));
 35         }
 36         if((room[i][k] & 2) == 0 ){
 37             stk.push(Room(i - 1, k));
 38         }
 39         if((room[i][k] & 4) == 0){
 40             stk.push(Room(i,k + 1));
 41         }
 42         if((room[i][k] & 8) == 0 ){
 43             stk.push(Room(i + 1, k));
 44         }
 45     }
 46     area[roomNum] = roomArea;
 47     if(maxArea < roomArea)
 48     {
 49         maxArea = roomArea;
 50     }
 51     roomArea = 0;
 52     roomNum ++;
 53 }
 54 int main()
 55 {
 56     freopen("castle.in","r",stdin);
 57     freopen("castle.out","w",stdout);
 58     scanf("%d%d",&M,&N);
 59     for(int i =0 ;i < N;i ++)
 60     {
 61         for(int j =0 ;j < M;j ++)
 62         {
 63             int x;
 64             scanf("%d",&room[i][j]);
 65         }
 66     }
 67     for(int i =0 ;i < N;i ++)
 68     {
 69         for(int j =0 ;j < M;j ++)
 70         {
 71             if(color[i][j] == 0)
 72                 dfs(i,j);
 73         }
 74     }
 75     cout<<roomNum - 1<<endl;
 76     cout<<maxArea<<endl;
 77     int ansi = N-1;
 78     int ansj = 0;
 79     char ansch;
 80     int changedMaxArea = area[color[ansi][ansj]];
 81     //j是东西向!farthest to the west优先!!
 82     for(int j = 0;j< M;j ++)
 83     {
 84         for(int i = N - 1;i>= 0;i --)
 85         {
 86             if(i-1>=0 && color[i][j] != color[i - 1][j])
 87             {
 88                 if(area[color[i][j]]+area[color[i - 1][j]] > changedMaxArea)
 89                 {
 90                     changedMaxArea = area[color[i][j]]+area[color[i - 1][j]];
 91                     ansi = i;
 92                     ansj = j;
 93                     ansch = ‘N‘;
 94                 }
 95             }
 96             if(j+1<M && color[i][j] != color[i][j + 1])
 97             {
 98                 if(area[color[i][j]]+area[color[i][j+1]] > changedMaxArea)
 99                 {
100                     changedMaxArea = area[color[i][j]]+area[color[i][j+1]];
101                     ansi = i;
102                     ansj = j;
103                     ansch = ‘E‘;
104                 }
105             }
106         }
107     }
108     cout<<changedMaxArea<<endl;
109     cout<<ansi+1<<" "<<ansj+1<<" "<<ansch<<endl;
110 }

原文地址:https://www.cnblogs.com/ggy778/p/12231337.html

时间: 2024-11-09 00:42:09

[USACO][暴力]The Castle的相关文章

[【USACO】The Castle(dfs+枚举)

思路很好像,卡了我很久的就是当最大房间一样的时候判断输出哪个的条件, = = 简直无情 /* ID: 18906421 LANG: C++ PROG: castle */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 55; int mat[maxn][maxn][2] = {0}; // 0 1 下 右 int n,m,vis[m

n!最右非零数字

n!最右非零数字 注此文大部分来自luoyuchu的blog + ##Description: 给出正整数N(可能有前导0),请求出N!最右非零的数位的值 + ##Range: n<=10^100 + HDU1066 弱化问题USACO 3.2.1 以前做USACO暴力水过了 这是多么的愚昧于是我去学习了一下 考虑虑到末位的0 是由于 2 * 5 这样的运算而产生的,那么我们把2与5成对的剔除就不会出现精度问题了? 其实问题还可以继续深入思考.我们考虑在 10^1000 下如何解决问题 我们考虑

USACO castle

<pre name="code" class="cpp"><pre>USER: Kevin Samuel [kevin_s1] TASK: castle LANG: C++ Compiling... Compile: OK Executing... Test 1: TEST OK [0.003 secs, 3688 KB] Test 2: TEST OK [0.005 secs, 3688 KB] Test 3: TEST OK [0.008

HDU 4277 USACO ORZ(暴力+双向枚举)

USACO ORZ Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3809    Accepted Submission(s): 1264 Problem Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastu

USACO Section2.1 The Castle 解题报告

castle解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 有N×M的矩阵,边框都是实际存在的“墙”.如下图: 1 2 3 4 5 6 7 ########################

【USACO】Wormholes(暴力搜索)

直接按照题意暴力就行 /* ID: 18906421 LANG: C++ PROG: wormhole */ #include<cstdio> #include<cstring> #include<vector> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 15; LL v[maxn]; int

USACO 2.1 The Castle

题目大意:给你一个城堡让你求有多少房间,最大房间有多大,敲掉一堵墙后最大的房间有多大,敲掉那座墙 思路:比较恶心的bfs题,反正就是bfs使劲敲 /*{ ID:a4298442 PROB:castle LANG:C++ } */ #include<iostream> #include<cstdio> #include<fstream> #include<queue> #include<algorithm> #define pii pair<

USACO 2.1.1 The Castle

{ ID:anniel11 PROG:castle LANG:PASCAL } var a:array[0..50,0..50 ,1..4] of boolean; component:array[0..50,0..50] of integer;//which room does it belong to room_size:array[0..2500] of integer; neighbour:array[0..2500,0..2500] of boolean; m,n,i,j,temp,c

usaco The Castle

题目给了一个二维矩阵,矩阵的每个数字代表一个单位的面积,每个数字转换为二进制,这个四位二进制数的每一位,分别代表了自己的东南西北是否有墙. 题目求房间的数目,最大的自然房间的大小,拆掉某一堵墙之后的可能会造成某两个自然房间合并,求合成最大房间的面积,以及拆除的抢的坐标,以及位置 做法是,对单位面积进行染色,可以相互联通的区域就是一个房间. 再设一个数组Size表示染色为i的房间的大小, 然后枚举拆掉每堵墙之后的情况,合成的房间的大小就是自己和自己相邻的单位面积所代表的房间大小(Size中的值)相