抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

一开始这个题目我用模拟做,这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
bool light[101][101];
int main(){
ios::sync_with_stdio(false);
int n,m,k,x,y,count=0;
cin >> n >> m >> k;
for(int i = 0;i < m;i ++){
cin >> x >> y;
light[x][y] = 1;
if(x+1<=n&&y+1<=n)light[x+1][y+1] = 1;
if(x-1>=1&&y-1>=1)light[x-1][y-1] = 1;
if(x+1<=n&&y-1>=1)light[x+1][y-1] = 1;
if(x-1>=1&&y+1<=n)light[x-1][y+1] = 1;
if(x+1<=n)light[x+1][y] = 1;
if(x+2<=n)light[x+2][y] = 1;
if(x-1>=1)light[x-1][y] = 1;
if(x-2>=1)light[x-2][y] = 1;
if(y+2<=n)light[x][y+2] = 1;
if(y+1<=n)light[x][y+1] = 1;
if(y-1>=1)light[x][y-1] = 1;
if(y-2>=1)light[x][y-2] = 1;
}
for(int i = 0;i < k;i ++){
cin >> x >> y;
for(int j = x;j <= x+5;j ++)for(int k1 = y;k1 <= 5+y;k ++)if(j<=n&&k1<=n)
light[j][k1]=1;
}
for(int j = 1;j <= n;j ++)for(int k1 = 1;k1 <= n;k1 ++){
if(!light[j][k1]) count++;
}
cout << count;
}

好极了,完美输出,结果……

能不能快一点?我把&&换成了&,结果……

没办法,那就来个记忆化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
using namespace std;
bool light[101][101];
int main(){
int n,m,k,x,y,count=0;
cin >> n >> m >> k;
count = n*n ;
for(int i = 0;i < m;i ++){
cin >> x >> y;
light[x][y] = 1;
if(x+1<=n&&y+1<=n){
if(!light[x+1][y+1]){
count -- ;
light[x+1][y+1] = 1;
}
}
if(x-1>=1&&y-1>=1){
if(!light[x-1][y-1]){
count --;
light[x-1][y-1] = 1;
}
}
if(x+1<=n&&y-1>=1){
if(!light[x+1][y-1]){
count--;
light[x+1][y-1] = 1;
}
}
if(x-1>=1&&y+1<=n){
if(!light[x-1][y+1]){
count--;
light[x-1][y+1] = 1;
}
}
if(x+1<=n){
if(!light[x+1][y]){
count--;
light[x+1][y] = 1;
}
}
if(x+2<=n){
if(!light[x+2][y]){
count--;
light[x+2][y] = 1;
}
}
if(x-1>=1){
if(!light[x-1][y]){
count --;
light[x-1][y] = 1;
}
}
if(x-2>=1){
if(!light[x-2][y]){
count --;
light[x-1][y] = 1;
}
}
if(y+2<=n){
if(!light[x][y+2]){
count --;
light[x][y+2] = 1;
}
}
if(y+1<=n){
if(!light[x][y+1]){
count --;
light[x][y+1] = 1;
}
}
if(y-1>=1){
if(!light[x][y-1]){
count --;
light[x][y-1] = 1;
}
}
if(y-2>=1){
if(!light[x][y-2]){
count --;
light[x][y-1] = 1;
}
}
}
for(int i = 0;i < k;i ++){
cin >> x >> y;
for(int j = x;j <= x+5;j ++)for(int k1 = y;k1 <= 5+y;k ++)if(j<=n&&k1<=n)
if(!light[j][k1]){
count --;
light[j][k1] = 1;
}
}
cout << count-1;
}

评论