如果我们建一个二维数组【n】【m】的话,那么毫无疑问,空间超限,
我原本思路就是这样 。改了好久,空间都过不去,后面放弃了原来的。
换了另一种一维的方法。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
int k = input.nextInt();
int[] map = new int[m + 1];
//map记录每行的列
int[] x = new int[k + 1];
int[] y = new int[k + 1];
for (int i = 1; i < k + 1; i++) {
//记录输入坐标,y为纵坐标,x为横坐标
y[i] = input.nextInt();
x[i] = input.nextInt();
}
Arrays.fill(map, 0);
//map全部初始化为0;
int t = 0, sum = 0;
//t统计每行里面不受攻击的格子数,sum统计总的不受攻击的格子数。
for (int i = 1; i <= n; i++) {
t = m;
//每次循环都重新赋值为列的个数m,每一个格子受到攻击,则t--;
for (int j = 1; j <= k; j++) {
if (y[j] == i) {
//如果y[j]==i;即当前i行上面有皇后,整一行都被攻击,t=0;
t = 0;
break;
}
if (map[x[j]] != i) {
//这里的i和map[x[j]]没有什么特殊的联系,不管是第几行,同列的攻击。
// 只是我们把赋值为i后,下面用!=i作为判断,以便下面判断斜线的时候不会重复统计
map[x[j]] = i;
t--;
}
if ((i + x[j] - y[j]) > 0 && (i + x[j] - y[j]) <= m && map[i + x[j] - y[j]] != i) {
//判断正斜线(x1-y1)==(x2-y2) --> x2==y2+x1-y1==i + x[j] - y[j];
map[i + x[j] - y[j]] = i;
t--;
}
if ((x[j] + y[j] - i) > 0 && (x[j] + y[j] - i) <= m && map[x[j] + y[j] - i] != i) {
//判断反斜线 (x1+y1)=(x2+y2) --> x2==x1+y1-y2==x[j] + y[j] - i;
map[x[j] + y[j] - i] = i;
t--;
}
}
sum += t;
}
System.out.println(sum);
}
}