一开始这个题目我用模拟做,这个样子:
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; }
|