题目描述

Once there was a pig, which was very fond of treasure hunting. One day, when it woke up, it found itself in a strange land of treasure. As for how to come in, or how to go out, no ways to know. Sad.

The good news is, it was lucky that it got the treasure map.

But there is a bad news too, this map is an encrypted map.

You can think of it as a matrix of R*C. Each grid is a number of Hexadecimal(十六进制), that is the number is between {‘0’,’1’,…’9’,’A’,’B’,…,’F’}, and the 4 length Binary number(4位二进制数) corresponding is the real treasure map.

For example, the number '0' on the encrypted graph represents the actual map ‘0000’, and '1' represents the actual map ‘0001’, ... The 'A' represents the actual map ‘1010’, and 'F' represents the actual map ‘1111’.

The owner of the treasure is very clever, he build some insuperable wall in the treasure to avoid stealing, we use ‘0’ to describe it. Obviously ‘1’ indicated that this grid bury exactly one diamond.

The pig can only walk up to four adjacent squares in the upper, lower, left and right directions at a time. Wherever it goes, it will dig out the diamond in this grid(if there is diamond buried in the grid) and put the diamond in its own package.

Though it has got the map, but doesn't know where it is in the peach blossom trap now, that means it could be at any ‘.’ in the matrix. It finds you smart to tell it how many diamonds it will get at most.

输入描述:

Multiple groups of test case. (no more than 10 groups. )
The first line of each group contains two numbers R and C,(0<=R, C<=3000), representing the number of rows and the number of columns of peach blossom trap, respectively. Stop the program when R and C are both 0.
Then there are next R lines, each line contains C characters, describe as above.
It is guarantee all the input is legal.

输出描述:

For each test case, output the answer on each line, representing the most number of diamonds can be obtained by the pig.
示例1

输入

5 2
E8
23
52
78
01 3 1
0
4
0 0 0

输出

6
1

说明

In the first example, the real treasure map is:
11101000
00100011
01010010
01111000
00000001
So it is possible to dig out 6 diamonds at most.

题解

$bfs$,压位。

主要是要想办法省内存,$01$矩阵可以压位,每$32$位$01$串拿一个$int$表示即可。

然后就是普通的$bfs$,队列的内存峰值也只有$1000$个位置的数量级。

#include <bits/stdc++.h>
using namespace std; const int maxn = 3000 + 10;
int r, c;
char s[maxn];
unsigned int m[maxn][450];
int f[maxn * 4];
int st[maxn], cnt; int dir[4][2] = {
{-1, 0},
{1, 0},
{0, -1},
{0, 1},
}; int out(int x, int y) {
if(x < 0 || x >= r) return 1;
if(y < 0 || y >= 4 * c) return 1;
return 0;
} int Get(int x, int y) {
unsigned int p = (unsigned)(1 << (y % 32));
if(m[x][y / 32] & p) return 1;
return 0;
} void Set(int x, int y) {
unsigned int p = (unsigned)(1 << (y % 32));
m[x][y / 32] = m[x][y / 32] ^ p;
} int main() {
while(~scanf("%d%d", &r, &c)) {
if(r == 0 && c == 0) break;
for(int i = 0; i < r; i ++) {
for(int j = 0; j < 400; j ++) {
m[i][j] = 0;
}
}
for(int i = 0; i < r; i ++) {
scanf("%s", s);
int sz = 0;
for(int j = 0; j < c; j ++) {
int num;
if(s[j] >= '0' && s[j] <= '9') num = s[j] - '0';
else num = s[j] - 'A' + 10; cnt = 0;
for(int k = 0; k < 4; k ++) {
st[cnt ++] = (num & (1 << k)) ? 1 : 0;
}
for(int k = 3; k >= 0; k --) {
f[sz ++] = st[k];
}
}
for(int j = 0; j < sz; j ++) {
m[i][j / 32] = m[i][j / 32] + (unsigned)(f[j] * (1 << (j % 32)));
}
} int ans = 0; for(int i = 0; i < r; i ++) {
for(int j = 0; j < 4 * c; j ++) {
if(Get(i, j) == 0) continue;
int sum = 0;
queue<int> Q;
Q.push(i * 4 * c + j);
Set(i, j);
while(!Q.empty()) {
int h = Q.front();
int x = h / (4 * c);
int y = h % (4 * c);
Q.pop();
sum ++;
for(int i = 0; i < 4; i ++) {
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(out(tx, ty)) continue;
if(Get(tx, ty) == 0) continue;
Q.push(tx * 4 * c + ty);
Set(tx, ty);
}
}
ans = max(ans, sum);
if(ans > r*c*2) break;
}
if(ans > r*c*2) break;
} printf("%d\n", ans);
}
return 0;
}

  

湖南大学ACM程序设计新生杯大赛(同步赛)J - Piglet treasure hunt Series 2的更多相关文章

  1. 湖南大学ACM程序设计新生杯大赛(同步赛)A - Array

    题目描述 Given an array A with length n  a[1],a[2],...,a[n] where a[i] (1<=i<=n) is positive integ ...

  2. 湖南大学ACM程序设计新生杯大赛(同步赛)L - Liao Han

    题目描述 Small koala special love LiaoHan (of course is very handsome boys), one day she saw N (N<1e1 ...

  3. 湖南大学ACM程序设计新生杯大赛(同步赛)B - Build

    题目描述 In country  A, some roads are to be built to connect the cities.However, due to limited funds, ...

  4. 湖南大学ACM程序设计新生杯大赛(同步赛)I - Piglet treasure hunt Series 1

    题目描述 Once there was a pig, which was very fond of treasure hunting. The treasure hunt is risky, and ...

  5. 湖南大学ACM程序设计新生杯大赛(同步赛)E - Permutation

    题目描述 A mod-dot product between two arrays with length n produce a new array with length n. If array ...

  6. 湖南大学ACM程序设计新生杯大赛(同步赛)D - Number

    题目描述 We define Shuaishuai-Number as a number which is the sum of a prime square(平方), prime cube(立方), ...

  7. 湖南大学ACM程序设计新生杯大赛(同步赛)H - Yuanyuan Long and His Ballons

    题目描述 Yuanyuan Long is a dragon like this picture?                                     I don’t know, ...

  8. 湖南大学ACM程序设计新生杯大赛(同步赛)G - The heap of socks

    题目描述 BSD is a lazy boy. He doesn't want to wash his socks, but he will have a data structure called ...

  9. 湖南大学ACM程序设计新生杯大赛(同步赛)C - Do you like Banana ?

    题目描述 Two endpoints of two line segments on a plane are given to determine whether the two segments a ...

随机推荐

  1. 前端PHP入门-033-连接数据库-天龙八步

    php检查MySQL的支持是否开启? 若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开即可! 注意: 从PHP7开始默认不再支持mysql ...

  2. string的内存本质

    虽然没有研究过string的源代码,不过可以确定的是string的内存空间是在堆上开辟的,它自己负责释放空间,不用我们关系. 我们用一个动态分配的字符串指针初始化一个string对象retStr,它会 ...

  3. 20155117王震宇 2006-2007-2 《Java程序设计》第一周学习总结

    20155117王震宇 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 尽量简单的总结一下本周学习内容 尽量不要抄书,浪费时间 看懂就过,看不懂,学习有心得的 ...

  4. NYOJ 208 Supermarket (模拟+并查集)

    题目链接 描述 A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Pr ...

  5. Verilog笔记.5.同步、异步

    在数字电路中经常有同步synchronism.异步asynchronism的概念.异步指输入信号和时钟无关:同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算.实际开发 ...

  6. JS 判断手机操作系统代码

    还是利用UA, 返回值: ios, android, unknown function getMobileType () { var ua = window.navigator.userAgent.t ...

  7. APP版本号记录

    VoLTE版本: VT_BV0800V1.0.0B06 800M版本: NETARTIST_BV0800V1.0.0B01 看详细版本号:9831275#

  8. PHP 快速建立一个对象

    前言 PHP 中的数组(尤其关联数组)是经常使用的 —— 因为方便.在一些框架中也经常见到返回数组格式的配置参数.然而有些时候可能需要对象而非数组类型的配置参数,在查阅网络资料后找到了方法,作以记录. ...

  9. Machine Learning系列--深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

    在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...

  10. 从LabVIEW到C++

    前言 最近一段时间一直没有更新,一方面是时间精力的问题(PS:懒癌犯了),另一方面是小黑大部分的时间都在学习C++相关知识,恶补了许多的知识(从大学C语言水平强制拔高了一段). 本文谈谈自己近期的一些 ...