BNUOJ 1021 信息战(七)——情报传递

信息战(七)——情报传递

Time Limit: 3000ms

Memory Limit: 262144KB

64-bit integer IO format: %lld      Java class name: Main

虽说现在是信息战,但是有些情报却是不能通过计算机进行传递的。所以呢,C国的情报员LZM在这种情况下就派上用场了,LZM可是情报界的神牛。(Orz,拜一个先~)所谓神牛见首不见尾(那位同学你说啥?神龙?可以活用嘛,给个面子哈……),作为一名优秀的情报员,LZM在传递情报的时候是需要避免让任何人看见的,尤其是A国的巡逻塔。
某日,LZM获得了一份关于A国的重要情报,他需要在最短的时间内把这份情报传递到司令部。我们假设现在LZM位于地图的(X,Y)点,而司令部位于(M,N)点,LZM在单位时间内只能往东南西北四个方向移动一个单位距离,地图上有若干个A国军队的哨塔,哨塔所在坐标以及它东西南北四个方向相邻的坐标都属于监视范围,如果LZM踏入那些区域就会被发现。定义LZM到司令部所需的最短时间为没有任何哨塔时LZM到司令部的最短时间。LZM想知道在有哨塔的情况下有多少种行走方法可以让他在最短时间内到达司令部。

Input

第一行:一个整数K,代表数据组数。
对于每一组数据:
第一行:四个整数,对应题目中的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

51isoft

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int INF = 0x3f3f3f3f;
  4 const int maxn = 500;
  5 const int dir[4][2] = {-1,0,0,1,0,-1,1,0};
  6 #define MAXN 200
  7 struct HP {
  8     int len,s[MAXN];
  9     HP() {
 10         memset(s,0,sizeof(s));
 11         len=1;
 12     }
 13     HP operator =(const char *num) { //字符串赋值
 14         len=strlen(num);
 15         for(int i=0; i<len; i++) s[i]=num[len-i-1]-‘0‘;
 16     }
 17
 18     HP operator =(int num) { //int 赋值
 19         char s[MAXN];
 20         sprintf(s,"%d",num);
 21         *this=s;
 22         return *this;
 23     }
 24
 25     HP(int num) {
 26         *this=num;
 27     }
 28
 29     HP(const char*num) {
 30         *this=num;
 31     }
 32
 33     string str()const { //转化成string
 34         string res="";
 35         for(int i=0; i<len; i++) res=(char)(s[i]+‘0‘)+res;
 36         if(res=="") res="0";
 37         return res;
 38     }
 39
 40     HP operator +(const HP& b) const {
 41         HP c;
 42         c.len=0;
 43         for(int i=0,g=0; g||i<max(len,b.len); i++) {
 44             int x=g;
 45             if(i<len) x+=s[i];
 46             if(i<b.len) x+=b.s[i];
 47             c.s[c.len++]=x%10;
 48             g=x/10;
 49         }
 50         return c;
 51     }
 52     void clean() {
 53         while(len > 1 && !s[len-1]) len--;
 54     }
 55
 56     HP operator *(const HP& b) {
 57         HP c;
 58         c.len=len+b.len;
 59         for(int i=0; i<len; i++)
 60             for(int j=0; j<b.len; j++)
 61                 c.s[i+j]+=s[i]*b.s[j];
 62         for(int i=0; i<c.len-1; i++) {
 63             c.s[i+1]+=c.s[i]/10;
 64             c.s[i]%=10;
 65         }
 66         c.clean();
 67         return c;
 68     }
 69
 70     HP operator - (const HP& b) {
 71         HP c;
 72         c.len = 0;
 73         for(int i=0,g=0; i<len; i++) {
 74             int x=s[i]-g;
 75             if(i<b.len) x-=b.s[i];
 76             if(x>=0) g=0;
 77             else {
 78                 g=1;
 79                 x+=10;
 80             }
 81             c.s[c.len++]=x;
 82         }
 83         c.clean();
 84         return c;
 85     }
 86     HP operator / (const HP &b) {
 87         HP c, f = 0;
 88         for(int i = len-1; i >= 0; i--) {
 89             f = f*10;
 90             f.s[0] = s[i];
 91             while(f>=b) {
 92                 f =f-b;
 93                 c.s[i]++;
 94             }
 95         }
 96         c.len = len;
 97         c.clean();
 98         return c;
 99     }
100     HP operator % (const HP &b) {
101         HP r = *this / b;
102         r = *this - r*b;
103         return r;
104     }
105
106     HP operator /= (const HP &b) {
107         *this  = *this / b;
108         return *this;
109     }
110
111
112     HP operator %= (const HP &b) {
113         *this = *this % b;
114         return *this;
115     }
116
117     bool operator < (const HP& b) const {
118         if(len != b.len) return len < b.len;
119         for(int i = len-1; i >= 0; i--)
120             if(s[i] != b.s[i]) return s[i] < b.s[i];
121         return false;
122     }
123
124     bool operator > (const HP& b) const {
125         return b < *this;
126     }
127
128     bool operator <= (const HP& b) {
129         return !(b < *this);
130     }
131
132     bool operator == (const HP& b) {
133         return !(b < *this) && !(*this < b);
134     }
135     bool operator != (const HP &b) {
136         return !(*this == b);
137     }
138     HP operator += (const HP& b) {
139         *this = *this + b;
140         return *this;
141     }
142     bool operator >= (const HP &b) {
143         return *this > b || *this == b;
144     }
145
146
147 };
148
149 istream& operator >>(istream &in, HP& x) {
150     string s;
151     in >> s;
152     x = s.c_str();
153     return in;
154 }
155
156 ostream& operator <<(ostream &out, const HP& x) {
157     out << x.str();
158     return out;
159 }
160 int dp[maxn][maxn],sx,sy,m,n,p;
161 HP cnt[maxn][maxn];
162 bool isIn(int x,int y) {
163     return x >= 0 && y >= 0 && x < 201 && y < 201;
164 }
165 struct node {
166     int x,y;
167     node(int x = 0,int y = 0) {
168         this->x = x;
169         this->y = y;
170     }
171 };
172 queue<node>q;
173 void bfs() {
174     while(!q.empty()) q.pop();
175     if(dp[sx][sy] == -1) {
176         dp[sx][sy] = 0;
177         cnt[sx][sy] = 1;
178         q.push(node(sx,sy));
179     }
180     while(!q.empty()) {
181         node now = q.front();
182         q.pop();
183         if(now.x == m && now.y == n && dp[now.x][now.y] != abs(m - sx) + abs(n - sy)) break;
184         for(int i = 0; i < 4; ++i) {
185             int nx = now.x + dir[i][0];
186             int ny = now.y + dir[i][1];
187             if(!isIn(nx,ny) || dp[nx][ny] == INF) continue;
188             if(dp[nx][ny] == -1 || dp[nx][ny] > dp[now.x][now.y] + 1) {
189                 dp[nx][ny] = dp[now.x][now.y] + 1;
190                 cnt[nx][ny] = cnt[now.x][now.y];
191                 q.push(node(nx,ny));
192             } else if(dp[nx][ny] == dp[now.x][now.y] + 1) {
193                 cnt[nx][ny] += cnt[now.x][now.y];
194             }
195         }
196     }
197 }
198 int main() {
199     int x,y,kase;
200     scanf("%d",&kase);
201     while(kase--) {
202         scanf("%d%d%d%d",&sx,&sy,&m,&n);
203         scanf("%d",&p);
204         memset(dp,-1,sizeof dp);
205         memset(cnt,0,sizeof cnt);
206         while(p--) {
207             scanf("%d%d",&x,&y);
208             dp[x][y] = INF;
209             for(int i = 0; i < 4; ++i) {
210                 int nx = x + dir[i][0];
211                 int ny = y + dir[i][1];
212                 if(!isIn(nx,ny)) continue;
213                 dp[nx][ny] = INF;
214             }
215         }
216         bfs();
217         if(dp[m][n] != abs(m - sx) + abs(n - sy)) cnt[m][n] = 0;
218         cout<<cnt[m][n]<<endl;
219     }
220     return 0;
221 }

时间: 2024-07-31 14:54:46

BNUOJ 1021 信息战(七)——情报传递的相关文章

BNUOJ 1055 走迷宫2

走迷宫2 Time Limit: 1000ms Memory Limit: 65535KB 64-bit integer IO format: %lld      Java class name: Main 走迷宫是很有趣的一种游戏,能够锻炼人的记忆力和思维.现在,HK被困在一个迷宫里面了,请你帮助他计算一下有多少种不同的走法,能够让他走出迷宫.这个迷宫很奇怪,HK只能够沿着向上或者向右的方向走,不能回头. 迷宫使用一个N*M的矩阵来描述,矩阵中用'.'代表空格可以通行,用'*'代表障碍物,用'

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

【Beta】 第七次Daily Scrum Meeting

第七次meeting会议 [Beta] 第七次Daily Scrum Meeting 一.本次会议为第七次meeting会议 二.时间:10:00AM-10:20AM 地点:禹州楼 三.会议站立式照片 四.今日任务安排 成员 昨日任务 今日任务 林晓芳 重观界面问题上的美化处理 对现有的东西进行总结,主要是关于此次采用的一些方法.库等等 林清青 与其他组探讨交流进度 对于接下里的任务方向与大家探讨 陈惠 重观界面问题上的美化处理 基于现有的东西进行更深入的完善,例如,如何让闹钟提醒更人性化 郑莹

SpringBoot - 二零一七0421小记

一.SpringBoot使用起来比起SpringMVC更便捷,在注解上的小变化,我记录了下面几个: @Controller + @ResponseBody = SpringMVC中用@RestController来代替前面两个注解,通过这个注解,可以将所有的前端http请求放入SpringBoot的Controller容器中,并返回json格式的数据给前端 @RequestMapping(value={"/hello","/hi"},method=RequestMe

第七课 进程通信

unix_c_07.txt================第七课 进程通信================一.基本概念------------1. 何为进程间通信~~~~~~~~~~~~~~~~~进程间通信(Interprocess Communication, IPC)是指两个,或多个进程之间进行数据交换的过程.2. 进程间通信分类~~~~~~~~~~~~~~~~~1) 简单进程间通信:命令行参数.环境变量.信号.文件.2) 传统进程间通信:管道(fifo/pipe).3) XSI进程间通信:

《七周七数据库》读书分享

# 七周七数据库 读书分享会第一期 2017.02.12 <七周七数据库> - Eric Redmond ## 预备知识 ACID:原子 一致 隔离 持久 CAP原则:一致性 可用性 分区容错性,在分布式环境下,至多只能同时满足其二 "小明,你的数据库作业呢?""我可以今天提交一半的作业,或者明天提交全部的作业,但无法在今天提交全部的作业.""...小明你给我滚出去!" 小知识点: * 原子性:原子性代表中间状态的透明性,想象从a账户

Java 第七章 类和对象 笔记

一.对象的特征--类的属性 每个对象的每个属性都有特定的值 对象的操作--类的方法 二.封装:对象同时具有属性和方法两项特性.     对象的属性和方法通常被封装在一起,共同体现事物的特性,     二者相辅相成,不能分割. 三.类和对象的区别:     类:抽象的概念,是一个模子,确定了对象的属性和方法.    对象:能够看得见摸得着的实物.具有静态和动态特征. 四.定义类的步骤:     1.定义类名      2.定义类的属性 访问修饰符 属性类型 属性名称=默认值:     3.定义类的

TCP/IP四层模型和OSI七层模型的概念

转:http://blog.csdn.net/superjunjin/article/details/7841099/ TCP/IP四层模型 TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层(对应OSI的第四层).   TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.这4层分别为: 应用层:应用程序间沟通的层,如简单电子邮件传