UVA 11205 The broken pedometer
这题题意一开始还理解错了。后来才知道是输出最少开几个灯,能表示所有数字。。
一开始的想法是深搜。。把每一种情况找出来求出最少的。。结果很悲剧啊 超时了无数次。。。
后来换思路。。用暴力。。大概思路 灯可能是开着或者关着的, 题目中灯为P盏,一盏灯有2种状态,按这样来考虑的话 一共只要枚举 2^p次 而p最多为15,,所以不会超时。。。
#include <stdio.h>
#include <string.h>
int t;
int p, n;
int map[105][20];
int vis[20];
int min;
int judge ()
{
int i, j, k;
for (i = 0; i < n; i ++)
for (j = i + 1; j < n ; j++)
{
for (k = 0; k < p; k ++)
{
if (vis[k] == 1)
{
if (map[i][k] != map[j][k])
break;
}
}
if (p == k)
{
return 0;
}
}
return 1;
}
void find(int star)
{
int num = 0;
for (int j = 0; j < p; j ++)
if (vis[j] == 1)
num ++;
if (judge() == 1 && num != 0)
{
if (min > num)
min = num;
}
if(star < p)
{
vis[star] = 1;
find(star + 1);
vis[star] = 0;
find(star + 1);
}
}
int main()
{
scanf("%d", &t);
while (t --)
{
min = 999;
memset(vis, 0, sizeof(vis));
memset(map, 0, sizeof(map));
scanf ("%d%d", &p, &n);
for (int i = 0; i < n ; i ++)
for (int j = 0; j < p; j ++)
scanf("%d", &map[i][j]);
find(0);
printf("%d\n", min);
}
return 0;
}