35 条题解
-
5猫粮寸断 LV 10 @ 2018-09-06 16:37:04
出题人对于坐标的理解真是毁天灭地。。。(既然是OI题就不能按OIer的习惯来吗)
注意到人每次只能往下或者往右走,于是可以用dp来做
预处理蝙蝠的情况,当某一时刻蝙蝠所在的点人恰好也会走到时,这个点就不能通过了,蝙蝠的行动和转向可以用数组搞出来
这坐标真令人自闭。。。#include<iostream> using namespace std; int map[110][110],dp[110][110],bx[5]={0,0,-1,0,1},by[5]={0,-1,0,1,0}; int z[4][5]={ 0,0,0,0,0, 0,2,3,4,1, 0,3,4,1,2, 0,4,1,2,3 }; int main() { int m,n,p,i,j,x,y,b,d,t,now; cin>>m>>n>>p; for(i=1;i<=p;i++) { cin>>x>>y; map[y][x]=1; } cin>>b; for(i=1;i<=b;i++) { cin>>x>>y>>d>>t; if(map[y][x]==1) continue; now=1; while(now<=m+n-1) { if(now==x+y-1) map[y][x]=2; int ha=0; while(1)//这里是防止有蝙蝠在一个点无限转向 { if(x+bx[d]>0&&x+bx[d]<=m&&y+by[d]>0&&y+by[d]<=n) if(map[y+by[d]][x+bx[d]]!=1) break; d=z[t][d]; ha++; if(ha>5) break; } if(ha>5) break; x+=bx[d]; y+=by[d]; now++; } } dp[1][1]=1; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(i==1&&j==1) continue; if(!map[i][j]) dp[i][j]=dp[i-1][j]+dp[i][j-1]; } cout<<dp[n][m]; return 0; }
-
02016-09-22 21:47:29@
简直了,,,,,首先你要注意它的x不是你的 i,,,,,
其次就是你要注意有这么一句话*若初始状态中蝙蝠与石柱重合,则认为蝙蝠在石柱上休息,不会动。*
还有三种蝙蝠的转向,,,,,,
尴尬
```C++
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#define maxn (100 + 5)
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
typedef long long int LLI;struct node {
int x;
int y;
int dir;
int val;
} op[maxn];LLI dp[maxn * 2][maxn][maxn];
int mar[maxn * 2][maxn][maxn];
int m,n,p,b,cntp = 0;int main() {
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d%d%d",&m,&n,&p);
memset(mar,0,sizeof(mar));
for(int i = 1; i <= p; i ++) {
int px,py;
scanf("%d%d",&py,&px);
for(int j = 1; j < m + n; j ++) mar[j][px][py] = -1;
}
scanf("%d",&b);
for(int i = 1; i <= b; i ++) {
int px,py,pz,pp;
scanf("%d%d%d%d",&py,&px,&pz,&pp);
if(mar[1][px][py] == -1) continue;
cntp ++;
op[cntp].x = px;
op[cntp].y = py;
op[cntp].dir = pz;
op[cntp].val = pp;
}
for(int i = 1; i < n + m; i ++) {
for(int j = 1; j <= cntp; j++) {
int px,py,cnt = 0;
while(1) {
if(cnt > 4) break;
cnt ++;
px = op[j].x;
py = op[j].y;
if(op[j].dir == 1) px --;
if(op[j].dir == 2) py --;
if(op[j].dir == 3) px ++;
if(op[j].dir == 4) py ++;
if(px <= 0 || px > n || py <= 0 || py > m || mar[i][px][py] == -1) {
if(op[j].val == 1) op[j].dir = op[j].dir % 4 + 1;
if(op[j].val == 2) op[j].dir = (op[j].dir + 1) % 4 + 1;
if(op[j].val == 3) op[j].dir = (op[j].dir + 2) % 4 + 1;
} else break;
}
if(cnt <= 4) {
if(mar[i + 1][px][py] == 0) mar[i + 1][px][py] = 1;
op[j].x = px;
op[j].y = py;
} else if(mar[i + 1][op[j].x][op[j].y] == 0) mar[i + 1][op[j].x][op[j].y] = 1;
}
}
memset(dp,0,sizeof(dp));
dp[1][1][1] = 1;
for(int i = 1; i < m + n; i ++) {
for(int j = 1; j <= n; j ++) {
for(int k = 1; k <= m; k ++) {
if(dp[i][j][k] == 0) continue;
if(j + 1 <= n && mar[i + 1][j + 1][k] == 0) dp[i + 1][j + 1][k] += dp[i][j][k];
if(k + 1 <= m && mar[i + 1][j][k + 1] == 0) dp[i + 1][j][k + 1] += dp[i][j][k];
}
}
}
printf("%lld\n",dp[m + n - 1][n][m]);
return 0;
}
``` -
02012-10-19 11:47:09@
垃圾题目 描述不清
MLGB 明明是先列再行 -
02012-09-26 23:13:30@
我想死啊,找了一个多小时的错误........居然是 变量p没有读入.....
-
02009-11-09 18:48:38@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms用小号交了15次才A啊。。我终于明白这题的通过率是整么搞出来的了。。
题目描述的太垃圾了 我看样例才发现自己横纵坐标搞错
晕死。。
题目不难 抓住(n+m-1)就行了
这样描述就是说去每个点的时间都是(x+y-1)
先预处理一下蝙蝠的n+m-1步的情况 如果第t步到的(x,y)满足 x+y-1=t
那那个点就不可以走到
然后就是f:=f+f; -
02009-10-29 10:35:59@
坐标实在太恼人了!
-
02009-10-22 19:12:01@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms======================销魂的分割线=========================
program v1175;
var g:array[0..101,0..101] of boolean;
f:array[0..101,0..101] of longint;
u:array[0..10201,0..101,0..101] of boolean;
i,j,k,n,m,xx,yy,a,b,x,y,r,p:longint;
procedure fang;
begin
case a of
1: begin
xx:=-1;
yy:=0;
end;
2: begin
xx:=0;
yy:=-1;
end;
3: begin
xx:=1;
yy:=0;
end;
4: begin
xx:=0;
yy:=1;
end;
end;
end;
begin
readln(m,n);
readln(p);
fillchar(g,sizeof(g),false);
for i:=1 to p do
begin
readln(y,x);
g[x,y]:=true;
end;
for i:=0 to n+1 do
begin
g:=true;
g:=true;
end;
for i:=0 to m+1 do
begin
g[0,i]:=true;
g[n+1,i]:=true;
end;
readln(k);
for j:=1 to k do
begin
readln(y,x,a,b);
if g[x,y] then continue;
u[1,x,y]:=true;
fang;
for i:=2 to n+m-1 do
begin
r:=0;
while (g[x+xx,y+yy])and(r4 then a:=a mod 4;
inc(r);
fang;
end;
if r -
02009-10-18 08:56:19@
此题坐标把我弄晕了
-
02009-10-05 16:00:57@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms我无语到家了
我把 第二个认为是 向右转
第三个 向后转
Wa 了N次
唉
无语至极啊
大家认真审题啊 -
02009-10-05 11:06:48@
虽然是DP,但是预处理实在是烦........
-
02009-08-11 18:03:30@
总算AC了
注意:柱子上的蝙蝠永远不动!! -
02009-08-10 21:31:02@
其实还是蛮水的,第一次AC难度3。。就是长了点。。~~我还以为一开始跟蝙蝠重合就死,居然没事的~~搞的交多一次。。。。
longint就行拉,,,我的方程弄到f[t,n]的。。然后每此t+,就模拟蝙蝠走~用两个数组。记录是否可到。。。。。。。 -
02009-08-07 22:45:09@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案错误...
├ 标准行输出
├ 错误行输出
├ 测试数据 08:答案错误...
├ 标准行输出
├ 错误行输出
├ 测试数据 09:答案错误...
├ 标准行输出
├ 错误行输出
├ 测试数据 10:答案错误...
├ 标准行输出
├ 错误行输出
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:60 有效耗时:0ms
咦,怎么就错了4个呢?看看大家的题解先……
糊涂啦!
预处理:
一个boolean表记录柱子所在的位置。
一个boolean表记录人到该位置时,蝙蝠能否到这里。
(我一开始就发觉方向不对劲,于是把1、2、3、4对应变成2、3、4、1了)
(蝙蝠要转动多次才有路走也是早就考虑了。而完全被困也早就归到蝙蝠在柱子上的情况,不过该位置一定要加进上述的第二个boolean表)
好像就差高精度没用了(现在是int64)
到底是什么问题呀?? -
02009-07-24 09:57:53@
晕死,方向搞错了,调了N久!
-
02009-07-24 09:06:36@
这是什么题目啦,
考察观察能力,方向都那变态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????????????????????????????????? -
02009-07-18 10:24:59@
因为一个小错误查了半天……
-
02009-05-30 21:09:19@
晕死…… 打错一个字母 wa n次
我 写 的 好 猥琐 啊,竟然 130 行 ……
-
02009-02-06 23:21:41@
第八个点蝙蝠和人一开始就重合(1,1)的时候,但人不会死!!!!!!!!
害我整了个小号,狂试!!!!
-
02008-11-12 10:12:32@
预处理花了55分钟。。。
dp用了5分钟……
调试用了5分钟……
恶心的预处理。。 -
02008-11-10 12:59:46@
这道题是斜线的动规
特别提示:蝙蝠的四周有可能都是柱子