POJ100

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);
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值