标签:
题目:
zero puzzling
There is a matrix with m rows and n columns. An element of the matrix has at most four adjacent elements(up, down, left, right). You can add a same number to a pair of adjacent elements of the matrix. By doing this operation repeatedly, can you make the matrix zero?
Input:
A line contains m and n indicating the rows and columns of the matrix. (0<m,n<5)
Each of the following m lines contains n integers(-10^6<=each integer<=10^6).
Input is terminated by one line contains two zeros.
Output:
If the matrix can be converted into zero, output "Yes" on a line otherwise output "No" on a line.
Sample Input:
2 2 1 1 1 0 2 2 0 0 1 1 0 0
Sample Output:
No
Yes
题意:给定一个m行n列的数字矩阵,问能否通过反复使用给定的操作,使得最终矩阵里的所有数字都为0.题目允许的操作是对矩阵中某对相邻数都加上同一个数值。
思路:对于4*4的矩阵,总共有24对相邻对。由于加的数值未知,搜索会超时。方法得另想。我们可以把间隔的格子分别染成黑白两色,把矩阵搞得如国际象棋棋盘一般。这样染色后,每个相邻对定是由一黑一白组成。令矩阵中所有白加起来为s1,所有黑加起来为s2。每次操作都会在s1和s2同时加上一个相同的数,因此不会改变s1和s2的差值。故而,要想获得零矩阵,s1与s2的差值一定为0。这是必要条件,那是否充分呢?是的。如果s1=s2,那么我们可以把矩阵所有的数通过操作集中要一个格子p上,假设p为白,那么s2=0,又s1=s2,故而p=0,获得零矩阵。集中的方法:设第一行为a,b,c,那么(a,b)同时加上-a,则为(0,b-a),同理(b-a,c)->(0,c-b+a),同理一直这样下去,直到最后的格子上,即获得零矩阵。根据以上分析,充要条件即为s1==s2。时间复杂度为O(mn)。
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int main(){ 6 int m,n; 7 while(scanf("%d%d",&m,&n),m||n){ 8 int s1=0,s2=0; 9 for(int i=1;i<=m;i++) 10 for(int j=1;j<=n;j++){ 11 int t; 12 scanf("%d",&t); 13 if((i+j)&1) s1+=t; 14 else s2+=t; 15 } 16 if(s1==s2) puts("Yes"); 17 else puts("No"); 18 } 19 return 0; 20 }
标签:
原文地址:http://www.cnblogs.com/jiu0821/p/4826562.html