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 }
View Code

 

转载于:https://www.cnblogs.com/crackpotisback/p/4800207.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值