题目描述

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. springsecurity remember-me 功能

    本文基于spring-security-web-4.1.2.RELEASE. 要实现rememberMe,有两种方案. 1.基于简单加密token的方法 首先需要在配置文件中加入<remembe ...

  2. NOIP模拟赛10

    T1 [HAOI2010]软件安装 https://daniu.luogu.org/problem/show?pid=2515 树上背包,如果有i必须有j,j作为i的父节点 O(nm²) #inclu ...

  3. NOIP 2014 提高组 Day1

    期望得分:100+100+50=250 实际得分:100+100+50=250 此次NOIP  ZJ省一分数线:500,SD:345 https://www.luogu.org/problem/lis ...

  4. codevs 1029 遍历问题

    1029 遍历问题 http://codevs.cn/problem/1029/  时间限制: 1 s  空间限制: 128000 KB     题目描述 Description 我们都很熟悉二叉树的 ...

  5. 接口自动化测试框架HttpRunner

    接口自动化测试框架 https://github.com/HttpRunner/HttpRunner http://debugtalk.com/post/ApiTestEngine-api-test- ...

  6. 20155117王震宇 实验三 敏捷开发与XP实践 实验报告

    实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实 ...

  7. 原生js写Ajax

    //原生js写ajax就像打电话 //打电话分下面4步//1.拿出手机//2.拨号//3.说话//4.挺对方说话 //ajax也分下面4步//1.创建ajax对象//2.连接到服务器//3.发送请求( ...

  8. WebStorm 2016激活

    最近在网上找到一个激活webStorm 的好东西.博主说对jetbrains下的所有产品都是可以用这种方式激活的...如:PhpStorm,IntelliJ JDEA等. 但别的产品我没有试过.对于w ...

  9. Java的继承和多态

    看了博客园里面的一个文章,关于java的继承和多态: class A ...{ public String show(D obj)...{ return ("A and D"); ...

  10. React Native DEMO for Android

    Demo1: 主要知识:navigator,fecth 地址:https://github.com/hongguangKim/ReactNativeDEMO1 Demo2: 主要知识:navigato ...