/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
Copyright (c) 2011 panyanyany All rights reserved.
URL : http://acm.hdu.edu.cn/showproblem.php?pid=1498
Name : 1498 50 years, 50 colors
Date : Friday, August 26, 2011
Time Stage : 1 hours
Result:
4499474 2011-08-26 21:00:07 Accepted 1498
15MS 272K 1856 B
C++ pyy
Test Data:
Review:
//----------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define FALSE 0
#define TRUE 1
#define infinity 0x0f0f0f0f
#define minus_inf 0x80808080
#define MAXSIZE 109
int n, k ;
int cover[MAXSIZE], link[MAXSIZE], count[MAXSIZE], record[MAXSIZE] ;
int map[MAXSIZE][MAXSIZE] ;
int find (int cur, int color)
{
int i ;
for (i = 1 ; i <= n ; ++i)
if (map[cur][i] == color && cover[i] == 0) // 颜色要一致,且没有覆盖过
{
cover[i] = 1 ; // 表示此次被覆盖
if (link[i] == 0 || find (link[i], color))
{
link[i] = cur ; // 形成了新的交替链
return 1 ;
}
}
return 0 ;
}
int getRes (int color)
{
int i, sum ;
sum = 0 ;
memset (link, 0, sizeof (link)) ; // 每一种颜色link 都要初始化
for (i = 1 ; i <= n ; ++i)
{
memset (cover, 0, sizeof (cover)) ;
sum += find (i, color) ;
}
return sum ;
}
int main ()
{
int i, j, res, iRecord ;
while (scanf ("%d%d", &n, &k), n | k)
{
iRecord = 0 ;
memset (map, 0, sizeof (map)) ; // 图表,记录气球分布
memset (count, 0, sizeof (count)) ; // 记数,记录各颜色的气球出现次数
memset (record, 0, sizeof (record)) ; // 记录,记录符合题意的气球
for (i = 1 ; i <= n ; ++i)
for (j = 1 ; j <= n ; ++j)
{
scanf ("%d", &map[i][j]) ;
++count[map[i][j]] ; // 记录各颜色气球的出现次数
}
for (i = 1 ; i <= 50 ; ++i)
if (count[i] && getRes (i) > k) // 如果i 颜色气球出现过,且打破所有
record[iRecord++] = i ; // i 的次数大于k
if (!iRecord)
printf ("-1\n") ;
else
{
for (i = 0 ; i < iRecord - 1 ; ++i)
printf ("%d ", record[i]) ;
printf ("%d\n", record[i]) ;
}
}
return 0 ;
}