楼主不妨换个角度看问题
我这样来描述你的问题
按键扫描,分为行扫描和列扫描
一个“完整干净”的列扫或一个“完整干净”的行扫确定唯一的一组按键
如果在一组按键中,相同的列扫描线对应了多个按键,并且相同的行扫描也对应了多个按键,则不能确定这组按键,也就是你题目中“是”的情况
“完整干净”的定义:所有的按键对不同的列扫描只使用一次,或所有的按键对不同的行扫描只使用一次
/**
写一个最大X8键盘的测试代码,复杂度o(N)
*/
typedef struct KeyCode{
unsigned char X;
unsigned char Y;
}KeyCode;
int CheckKey(KeyCode* pKey, int keyCnt)
{
int i = 0;
int x = 0;
int y = 0;
unsigned char XMap = 0;
unsigned char YMap = 0;
for(i=0;i<keyCnt;i++){
if( ! ((1<<pKey.X) & XMap) ){
// 如果这条X扫描线是干净的,则X计数值加
x++;
}
if( ! ((1<<pKey.Y) & YMap) ){
// 如果这条Y扫描线是干净的,则Y计数值加
y++;
}
//标记这条X扫描线是脏的
XMap |= (1<<pKey.X);
//标记这条Y扫描线是脏的
YMap |= (1<<pKey.Y);
}
// 如果x与keyCnt相同,则说明没有按键使用相同的行扫描
// 如果y与keyCnt相同,则说明没有按键使用相同的列扫描
// x,y任意一个与keyCnt相等,则可确定这组按键
if(x == keyCnt || y == keyCnt){
// 如果X或Y扫描线计数值与keyCnt相同,则说明没有冲突发生
return 0;
}
// 否则发生冲突
return 1;
}
/**
根据楼主写的测试用例1表示是,表示否
输出为:
1
1
1
0
0
0
*/
#include "stdio.h"
KeyCode key1[] = {{4,0},{1,2},{4,2}};
KeyCode key2[] = {{2,1},{1,2},{2,2}};
KeyCode key3[] = {{1,1},{3,1},{1,2}};
KeyCode key4[] = {{1,2},{2,2},{3,2},{4,2}};
KeyCode key5[] = {{1,2},{2,1},{3,1},{4,2}};
KeyCode key6[] = {{1,2},{2,2},{3,1},{4,0}};
int main()
{
printf("%d\n",CheckKey(key1,3));
printf("%d\n",CheckKey(key2,3));
printf("%d\n",CheckKey(key3,3));
printf("%d\n",CheckKey(key4,4));
printf("%d\n",CheckKey(key5,4));
printf("%d\n",CheckKey(key6,4));
getchar();
return 0;
}
P.S.
21楼也说了,即然你都得到这些按键的值了,用不着再用软件去判断了吧
如果你硬件上的限制让你得不到正确的键值,用软件也没办法判断出来 |