湖南大学ACM程序设计新生杯大赛(同步赛)J - Piglet treasure hunt Series 2
题目描述
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.
输入
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的更多相关文章
- 湖南大学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 ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)L - Liao Han
题目描述 Small koala special love LiaoHan (of course is very handsome boys), one day she saw N (N<1e1 ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)B - Build
题目描述 In country A, some roads are to be built to connect the cities.However, due to limited funds, ...
- 湖南大学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 ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)E - Permutation
题目描述 A mod-dot product between two arrays with length n produce a new array with length n. If array ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)D - Number
题目描述 We define Shuaishuai-Number as a number which is the sum of a prime square(平方), prime cube(立方), ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)H - Yuanyuan Long and His Ballons
题目描述 Yuanyuan Long is a dragon like this picture? I don’t know, ...
- 湖南大学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 ...
- 湖南大学ACM程序设计新生杯大赛(同步赛)C - Do you like Banana ?
题目描述 Two endpoints of two line segments on a plane are given to determine whether the two segments a ...
随机推荐
- webpack中Module build failed: Unknown word (2:1)
在新建的webpack.config.js文件中配置好style-loader和css-loader,注意顺序为:style-loader,css-loader,less-loader,postcss ...
- ORACLE创建用户,建表空间,授予权限
1.创建用户表空间 CREATE TABLESPACE my_tsLOGGINGDATAFILE 'D:\app\win7\oradata\orcl\my_ts.dbf' SIZE 10M AUTOE ...
- 动态规划:双重DP
之前做过的传纸条那道题就是双重动态规划的典型应用,题意就不描述了,直接贴一下以前写过的,经典代码 #include<iostream> using namespace std; ,maxm ...
- DLL初试
环境: VC++6.0 步骤: 1.建立一个WIN32 DYNAMIC-LINK LIBRARY工程,编写CPP文件,文件内容例如: #include "stdafx.h" #in ...
- MySQL异常总结
1.Packets larger than max_allowed_packet are not allowed MySQL的一个系统参数:max_allowed_packet,其默认值为104857 ...
- VS调试程序快捷键和系统快捷键
调试程序快捷键 编译程序:F7 运行程序:ctrl + F5 打断点:F9 运行到断点位置:F5 单步执行:F10 单步进入函数:F11 结束调试:shift+F5 注释代码:ctrl+k,ctrl+ ...
- IE6+IE7+IE8+IE9+FF兼容性调试
HACK原理:不同浏览器对各中字符的识别不同 (读完文章你会发现,FF和IE8对以下字符的识别能力完全相同) 在 CSS中常用特殊字符识别表: (1)*: IE6+IE7都能识别*,而标准浏览器FF ...
- 【leetcode 简单】 第五十三题 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+------------------+ | Id | Email | +-- ...
- spring3-spring的事务管理机制
1. Spring的事务管理机制 Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的: PlatformTransactionManager:事务管理器—主要用于平 ...
- Git和Github简单教程【转】
转自:https://www.cnblogs.com/schaepher/p/5561193.html#clone 原文链接:Git和Github简单教程 网络上关于Git和GitHub的教程不少,但 ...