1000:翻转卡片
总时间限制:
-
3000ms
内存限制:
-
65536kB
描述
-
现在有N*N张卡片,组成了一个N*N的矩阵。这些卡片或者正面放置或者反面放置。现在,Acer想对这些卡片做一些翻转操作,使得所有的牌在翻转之后都正面朝上。在每一次操作中,Acer只能对一个M*M的子矩阵里的所有卡片做一次正反面翻转,也即将这个M*M矩阵中正面放置的卡片变成反面朝上,反面放置的卡片变成正面朝上。Acer想知道最少通过几次操作能够实现他的目标。
输入
-
第一行,两个整数N和M。
接下来的N行里,每一行1个整数。如果这个整数位1,表示这张对应的卡片在初始状态下时正面放置的;否则这张卡片最初是反面放置的。
对于所有数据,0<m<=n<=1000。< p="">
输出
-
一个整数,表示实现目标所需要的最小操作次数。如果不可能实现目标,请输出-1。
样例输入
-
4 2
1 1 0 0
0 0 1 1
1 1 1 1
0 0 0 0
样例输出:5
下面是我的解决方案,着重学习如何上下左右遍历矩阵,以及01转换import java.util.Scanner;
public class Card1000 {
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
String nm = input.nextLine();
String[] nmTemp = nm.split(" ");
int n = Integer.parseInt(nmTemp[0]);
int m = Integer.parseInt(nmTemp[1]);
if(m>n)
{
System.out.println(-1);
return;
}
int[][] nn = new int[n][n];
for(int i = 0;i<n;i++)
{
String[] tempnn = new String[n];
tempnn[i] = input.nextLine();
String[] line = tempnn[i].split(" ");
for(int j = 0;j<n;j++)
{
nn[i][j] = Integer.parseInt(line[j]);
}
}
input.close();
int counter = 0;
for(int i = 0;i<n-m+1;i=i+1)
{
for(int j =0;j<n-m+1;j=j+1)
{
if(nn[i][j]==0)
{
for(int k=i;k<i+m;k++){
for(int p=j;p<j+m;p++)
{
nn[k][p]=(-nn[k][p])+1;
}
}
counter++;
}
}
}
System.out.println(counter);
}
}
-
总时间限制:
- 3000ms 内存限制:
- 65536kB
-
描述
- 现在有N*N张卡片,组成了一个N*N的矩阵。这些卡片或者正面放置或者反面放置。现在,Acer想对这些卡片做一些翻转操作,使得所有的牌在翻转之后都正面朝上。在每一次操作中,Acer只能对一个M*M的子矩阵里的所有卡片做一次正反面翻转,也即将这个M*M矩阵中正面放置的卡片变成反面朝上,反面放置的卡片变成正面朝上。Acer想知道最少通过几次操作能够实现他的目标。 输入
-
第一行,两个整数N和M。
接下来的N行里,每一行1个整数。如果这个整数位1,表示这张对应的卡片在初始状态下时正面放置的;否则这张卡片最初是反面放置的。
对于所有数据,0<m<=n<=1000。< p="">
输出
- 一个整数,表示实现目标所需要的最小操作次数。如果不可能实现目标,请输出-1。 样例输入
-
4 2 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0
样例输出:5
下面是我的解决方案,着重学习如何上下左右遍历矩阵,以及01转换import java.util.Scanner;
public class Card1000 {
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
String nm = input.nextLine();
String[] nmTemp = nm.split(" ");
int n = Integer.parseInt(nmTemp[0]);
int m = Integer.parseInt(nmTemp[1]);
if(m>n)
{
System.out.println(-1);
return;
}
int[][] nn = new int[n][n];
for(int i = 0;i<n;i++)
{
String[] tempnn = new String[n];
tempnn[i] = input.nextLine();
String[] line = tempnn[i].split(" ");
for(int j = 0;j<n;j++)
{
nn[i][j] = Integer.parseInt(line[j]);
}
}
input.close();
int counter = 0;
for(int i = 0;i<n-m+1;i=i+1)
{
for(int j =0;j<n-m+1;j=j+1)
{
if(nn[i][j]==0)
{
for(int k=i;k<i+m;k++){
for(int p=j;p<j+m;p++)
{
nn[k][p]=(-nn[k][p])+1;
}
}
counter++;
}
}
}
System.out.println(counter);
}
}