AcWing 3565. 完美矩阵--java 用坐标积与和 用来表示set的地址,进而去重
原题链接
中等
作者:
Acvv_scl
,
2021-05-26 00:02:07
,
所有人可见
,
阅读 456
import java.util.*;
public class Main{
static int N=110;
static int [][]w=new int [N][N];
static int n;
static int m;
//用坐标和与坐标的积 来表示 坐标是否重复
static int getSum(int x,int y){
return x*y+x+y;
}
static long calc(List<int[]>in){
List<Integer>list=new ArrayList();
for(int[]t:in){
list.add(w[t[0]][t[1]]);
}
Collections.sort(list);
long res=0;
for(int x:list){
res+=Math.abs(x-list.get(list.size()/2));
}
return res;
}
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t-->0){
n=sc.nextInt();
m=sc.nextInt();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
w[i][j]=sc.nextInt();
}
}
long res=0;
for(int i=0;i<=n-1-i;i++){
for(int j=0;j<=m-1-j;j++){
List<int[]>list=new ArrayList();
Set<Integer>set=new HashSet();
set.add(getSum(i,j));
list.add(new int []{i,j});
if(!set.contains(getSum(i,m-1-j))){
list.add(new int[]{i,m-1-j});
//为啥 这部分 必须要注释掉?不注释掉就不对呢?
// set.add(getSum(i,m-1-j));
}
if(!set.contains(getSum(n-1-i,j))){
list.add(new int[]{n-1-i,j});
// set.add(getSum(n-1-i,j));
}
if(!set.contains(getSum(n-1-i,m-1-j))){
list.add(new int[]{n-1-i,m-1-j});
// set.add(getSum(n-1-i,m-1-j));
}
res+=calc(list);
}
}
System.out.println(res);
}
}
}
感觉 这样写法有bug啊, 总感觉下面这种写法才是正确的;但是下面这种写法不通过
if(!set.contains(getSum(i,m-1-j))){
list.add(new int[]{i,m-1-j});
set.add(getSum(i,m-1-j));
}