【题解】LuoguP1789 插火把

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

#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; 
}

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

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

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

#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; 
}
posted @ 2020-03-10 17:06  SD!LTF  阅读(153)  评论(0编辑  收藏  举报