BNUOJ 1021 信息战(七)——情报传递
信息战(七)——情报传递
64-bit integer IO format: %lld Java class name: Main
某日,LZM获得了一份关于A国的重要情报,他需要在最短的时间内把这份情报传递到司令部。我们假设现在LZM位于地图的(X,Y)点,而司令部位于(M,N)点,LZM在单位时间内只能往东南西北四个方向移动一个单位距离,地图上有若干个A国军队的哨塔,哨塔所在坐标以及它东西南北四个方向相邻的坐标都属于监视范围,如果LZM踏入那些区域就会被发现。定义LZM到司令部所需的最短时间为没有任何哨塔时LZM到司令部的最短时间。LZM想知道在有哨塔的情况下有多少种行走方法可以让他在最短时间内到达司令部。
Input
对于每一组数据:
第一行:四个整数,对应题目中的X、Y、M、N,范围均为[0,200]。
第二行:一个整数P(0<=P<M*N),代表哨塔个数。
第三~P+2行:两个整数I、J代表哨塔位置,范围均为[0,200]。
Output
Sample Input
2
0 0 5 5
2
3 3
5 2
5 5 3 3
1
4 4
Sample Output
11
0
Source
Author
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
const int dir[][] = {-,,,,,-,,};
#define MAXN 200
struct HP {
int len,s[MAXN];
HP() {
memset(s,,sizeof(s));
len=;
}
HP operator =(const char *num) { //字符串赋值
len=strlen(num);
for(int i=; i<len; i++) s[i]=num[len-i-]-'';
} HP operator =(int num) { //int 赋值
char s[MAXN];
sprintf(s,"%d",num);
*this=s;
return *this;
} HP(int num) {
*this=num;
} HP(const char*num) {
*this=num;
} string str()const { //转化成string
string res="";
for(int i=; i<len; i++) res=(char)(s[i]+'')+res;
if(res=="") res="";
return res;
} HP operator +(const HP& b) const {
HP c;
c.len=;
for(int i=,g=; g||i<max(len,b.len); i++) {
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%;
g=x/;
}
return c;
}
void clean() {
while(len > && !s[len-]) len--;
} HP operator *(const HP& b) {
HP c;
c.len=len+b.len;
for(int i=; i<len; i++)
for(int j=; j<b.len; j++)
c.s[i+j]+=s[i]*b.s[j];
for(int i=; i<c.len-; i++) {
c.s[i+]+=c.s[i]/;
c.s[i]%=;
}
c.clean();
return c;
} HP operator - (const HP& b) {
HP c;
c.len = ;
for(int i=,g=; i<len; i++) {
int x=s[i]-g;
if(i<b.len) x-=b.s[i];
if(x>=) g=;
else {
g=;
x+=;
}
c.s[c.len++]=x;
}
c.clean();
return c;
}
HP operator / (const HP &b) {
HP c, f = ;
for(int i = len-; i >= ; i--) {
f = f*;
f.s[] = s[i];
while(f>=b) {
f =f-b;
c.s[i]++;
}
}
c.len = len;
c.clean();
return c;
}
HP operator % (const HP &b) {
HP r = *this / b;
r = *this - r*b;
return r;
} HP operator /= (const HP &b) {
*this = *this / b;
return *this;
} HP operator %= (const HP &b) {
*this = *this % b;
return *this;
} bool operator < (const HP& b) const {
if(len != b.len) return len < b.len;
for(int i = len-; i >= ; i--)
if(s[i] != b.s[i]) return s[i] < b.s[i];
return false;
} bool operator > (const HP& b) const {
return b < *this;
} bool operator <= (const HP& b) {
return !(b < *this);
} bool operator == (const HP& b) {
return !(b < *this) && !(*this < b);
}
bool operator != (const HP &b) {
return !(*this == b);
}
HP operator += (const HP& b) {
*this = *this + b;
return *this;
}
bool operator >= (const HP &b) {
return *this > b || *this == b;
} }; istream& operator >>(istream &in, HP& x) {
string s;
in >> s;
x = s.c_str();
return in;
} ostream& operator <<(ostream &out, const HP& x) {
out << x.str();
return out;
}
int dp[maxn][maxn],sx,sy,m,n,p;
HP cnt[maxn][maxn];
bool isIn(int x,int y) {
return x >= && y >= && x < && y < ;
}
struct node {
int x,y;
node(int x = ,int y = ) {
this->x = x;
this->y = y;
}
};
queue<node>q;
void bfs() {
while(!q.empty()) q.pop();
if(dp[sx][sy] == -) {
dp[sx][sy] = ;
cnt[sx][sy] = ;
q.push(node(sx,sy));
}
while(!q.empty()) {
node now = q.front();
q.pop();
if(now.x == m && now.y == n && dp[now.x][now.y] != abs(m - sx) + abs(n - sy)) break;
for(int i = ; i < ; ++i) {
int nx = now.x + dir[i][];
int ny = now.y + dir[i][];
if(!isIn(nx,ny) || dp[nx][ny] == INF) continue;
if(dp[nx][ny] == - || dp[nx][ny] > dp[now.x][now.y] + ) {
dp[nx][ny] = dp[now.x][now.y] + ;
cnt[nx][ny] = cnt[now.x][now.y];
q.push(node(nx,ny));
} else if(dp[nx][ny] == dp[now.x][now.y] + ) {
cnt[nx][ny] += cnt[now.x][now.y];
}
}
}
}
int main() {
int x,y,kase;
scanf("%d",&kase);
while(kase--) {
scanf("%d%d%d%d",&sx,&sy,&m,&n);
scanf("%d",&p);
memset(dp,-,sizeof dp);
memset(cnt,,sizeof cnt);
while(p--) {
scanf("%d%d",&x,&y);
dp[x][y] = INF;
for(int i = ; i < ; ++i) {
int nx = x + dir[i][];
int ny = y + dir[i][];
if(!isIn(nx,ny)) continue;
dp[nx][ny] = INF;
}
}
bfs();
if(dp[m][n] != abs(m - sx) + abs(n - sy)) cnt[m][n] = ;
cout<<cnt[m][n]<<endl;
}
return ;
}
BNUOJ 1021 信息战(七)——情报传递的更多相关文章
- BNUOJ 1006 Primary Arithmetic
Primary Arithmetic 来源:BNUOJ 1006http://www.bnuoj.com/v3/problem_show.php?pid=1006 当你在小学学习算数的时候,老师会教你 ...
- 【Beta阶段】第七次Scrum Meeting!
每日任务内容: 本次会议为第七次Scrum Meeting会议~ 由于本次会议项目经理召开时间为10:00,在宿舍召开,召开时长约20分钟. 队员 昨日完成任务 明日要完成任务 刘乾 #177(未完成 ...
- 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC
本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...
- 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 《LoadRunner12七天速成宝典》来了
看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...
- 【SAP业务模式】之ICS(七):IDOC配置
这是ICS业务模式系列的最后一篇了,主要讲解IDOC的配置. 一.指定EDI传输的供应商逻辑地址 事务代码:WEL1 注意:上面逻辑地址是生产公司+内部客户.有以下两种情形: 1.如果内部客户都是纯数 ...
- 我的MYSQL学习心得(七) 查询
我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- Nodejs之MEAN栈开发(七)---- 用Angular创建单页应用(下)
上一节我们走通了基本的SPA基础结构,这一节会更彻底的将后端的视图.路由.控制器全部移到前端.篇幅比较长,主要分页面改造.使用AngularUI两大部分以及一些优化路由.使用Angular的其他指令的 ...
随机推荐
- ※交换排序(1)——快速排序(quick sort)
快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列.步骤为: 从序列中挑出一个元素,作为"基准"(pivot). 把所有比基准值小的元素放在基准 ...
- WebSocket握手总结
网址:http://blog.csdn.net/edwingu/article/details/44040961 WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器 ...
- Webservice 的安全策略
摘自:http://www.cnblogs.com/shengel/archive/2008/11/20/1337723.html Webservice为作为方便的服务被用广大领域使用的同时, ...
- json Date对象在js中的处理办法
我们在程序用往往通过ajax方式返回json数据,json中包含Date对象时,在js中是Object对象.可以方式获取: 1.new Date(yourJsonDate.time); //你用你的返 ...
- [NOI1997] 积木游戏(dp)
COGS 261. [NOI1997] 积木游戏 http://www.cogs.pro/cogs/problem/problem.php?pid=261 ★★ 输入文件:buildinggame ...
- A* 寻路算法[转载]
A* 寻路算法 转载地址:http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 原文地址: http://www.gamedev ...
- Task.Run 和 Task.Factory.StartNew
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- 批量建文件夹【win7企业版】
在记事本中notepad.exe按如下格式编辑好 md + 空格 + 文件夹名字(多个之间用空格隔开) 保存为.bat格式,运行即可批量创建文件夹.
- hdu2639,第K优决策
在dp问题中如果遇到问题,没有什么是加一维度不能解决的,如果不能,再加一维度. #include<iostream> #include<cstring> #include< ...
- html——meta标签、link标签
<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任何内容.&l ...