P1789 【Mc生存】插火把

2020-08-13 10:39:14

在这里插入图片描述
自己寫了快一個小時,陣列越界了,只得了20分

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

int main()
{
    int n, m, i, j, k, l, cnt = 0;
    scanf("%d %d %d", &n, &m, &k);		//m是火把數,k是螢石數
	int sign[n][n], mnum[m][2], knum[k][2];
	for ( i = 0; i < n; i++)
		for ( j = 0; j < n; j++)
			sign[i][j] = 0;
	
    for ( i = 0; i < m; i++)
    	scanf("%d %d", &mnum[i][0], &mnum[i][1]);
    for ( i = 0; i < k; i++)
    	scanf("%d %d", &knum[i][0], &knum[i][1]);
    for ( i = 0; i < m; i++){
    	for ( j = 0; j < 5; j++){
    		sign[mnum[i][0] - 1 ][j] = 1;
    		sign[j][mnum[i][1] - 1] = 1;
    		
		}
		sign[mnum[i][0] - 2][mnum[i][1] - 2] = 1;
		sign[mnum[i][0]][mnum[i][1]] = 1;
		sign[mnum[i][0] - 2][mnum[i][1]] = 1;
		sign[mnum[i][0]][mnum[i][1] - 2] = 1;
    		
	}
	for ( i = 0; i < k; i++){
    	for (j = knum[i][0] - 3; j < knum[i][0] + 2; j++)
    		for (l = knum[i][1] - 3; l < knum[i][1] + 2; l++)
    			sign[j][l] = 1;
    
    		
	}
	for ( i = 0; i < n; i++)
		for ( j = 0; j < n; j++)
			if (sign[i][j] == 1)
				cnt++;
				
	printf("%d", n*n - cnt);
    return 0;
}

在这里插入图片描述
然後修改了洛谷ztz_cpp帶佬的C++程式碼

#include<stdio.h>

int n,m,k,x,y,i,j,u,v,ans;//n,m,k(題目),x,y(臨時座標),i,j,u,v(回圈變數),ans(答案)。

int main(){
	int ma[1000][1000];//自己試了幾次,數據只有這麼大……
    scanf("%d %d %d", &n, &m, &k);
    for(i=1;i<=m;i++){//火把
        scanf("%d %d", &x, &y);
        ma[x-2][y]=ma[x-1][y+1]=ma[x-1][y]=ma[x-1][y-1]=ma[x][y+2]=ma[x][y+1]=ma[x][y]=ma[x][y-1]=ma[x][y-2]=ma[x+1][y+1]=ma[x+1][y]=ma[x+1][y-1]=ma[x+2][y]=1;//要標記有光的。(慢慢打,有點麻煩。)
    }
    for(i=1;i<=k;i++){//螢石
        scanf("%d %d", &x, &y);
        for(u=-2;u<=2;u++)
            for(v=-2;v<=2;v++)
                ma[x+u][y+v]=1;//螢石用回圈標記,程式碼就短一些。
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(ma[i][j]==0)
                ans++;
    printf("%d", ans);
    return 0;
}

在这里插入图片描述