按照要求来看,就是将矩阵修改为只有两个值的矩阵,矩阵中横纵坐标相加为奇数和偶数的值分别是两个不同的值即可。
如:
1 1 1 1 5 1
1 1 1 只需要转换成 5 1 5 就可以,一共改变了四个值。
1 1 1 1 5 1
思想是使用两个HashMap分别存储下标和为奇数和偶数的值(键值代表这个数,value对应这个数的出现次数),然后找到里面value最大的值,将其对应的键值分别记为num1
和num2,如果num1==num2,那么就处理一下这个特殊情况。代码如下:
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt())
{
int n = sc.nextInt();
int m = sc.nextInt();
int [][] nums = new int[n][m];
'''int temp = sc.nextInt();犯了一个愚蠢的错误,本来要用temp给nums[i][j]赋值,结果光写了个sc.nextInt()导致程序一直超时。。。。'''
for(int i=0;i<n;i++)
{
for(int j =0;j<m;j++)
{
nums[i][j]=sc.nextInt();
}
}
HashMap<Integer,Integer> map1=new HashMap<Integer,Integer>();
HashMap<Integer,Integer> map2=new HashMap<Integer,Integer>();
int max_num1=0;
int max_num2=0;
for(int x=0;x<n;x++){
for(int y=0;y<m;y++)
{
if(1==(x+y)%2)
{
if(map1.containsKey(nums[x][y]))
{
map1.put(nums[x][y],map1.get(nums[x][y])+1);
}
else
{
map1.put(nums[x][y],1);
}
max_num1=Math.max(max_num1,map1.get(nums[x][y]));
}
if(0==(x+y)%2)
{
if(map2.containsKey(nums[x][y]))
{
map2.put(nums[x][y],map2.get(nums[x][y])+1);
}
else
{
map2.put(nums[x][y],1);
}
max_num2=Math.max(max_num2,map2.get(nums[x][y]));
}
}
}
//Collection<Integer> count1=map1.values;
//Collection<Integer> count2=map2.values;
//int max_num1=Collections.max(count1);
//int max_num2=Collections.max(count2);
int num1=0,num2=0;
for(Map.Entry<Integer,Integer> entry:map1.entrySet())
{
if(max_num1==entry.getValue())
{
num1=entry.getKey();
}
}
for(Map.Entry<Integer,Integer> entry:map2.entrySet())
{
if(max_num2==entry.getValue())
{
num2=entry.getKey();
}
}
int flag=0;
if(num1==num2)
{
map2.remove(num2);
if(!map2.isEmpty()){
for(int x=0;x<n;x++){
for(int y=0;y<m;y++)
{
if(0==(x+y)%2&&nums[x][y]!=num2)
{
max_num2=Math.max(max_num2,map2.get(nums[x][y]));
}
}
}
for(Map.Entry<Integer,Integer> entry:map2.entrySet())
{
if(max_num2==entry.getValue())
{
num2=entry.getKey();
}
}
}
else
{
flag=1;
num2=num1+1;
}
}
int sum=0;
for(int x=0;x<n;x++){
for(int y=0;y<m;y++)
{
if(1==(x+y)%2)
{
if(nums[x][y]!=num1)
{
sum++;
}
}
if(0==(x+y)%2)
{
if(nums[x][y]!=num2)
{
sum++;
}
}
}
}
if(flag==1)
{
sum=Math.min(sum,n*m-sum);
}
System.out.println(sum);
for(int x=0;x<n;x++){
for(int y=0;y<m;y++)
{
System.out.println(nums[x][y]);
}
}
}
}
}