|
|
发表于 2011-7-3 13:07:56
|
显示全部楼层
豆子的思路很好, 不过仅限于类似4个数位组合的情况, 一旦数位增多, 姜饼小人怀疑数学上是否可行, 毕竟要找到那么多特征数字.
还有一种方法就是用矩阵:
比如说你有三种情况要执行命令A:
1001
0100
0110
首先将所有情况做成一个矩阵:
| 100 |
| 011 | = M
| 001 |
| 100 |
然后对于任意输入, 例如 I = 1000
先取反: 0111
然后和矩阵cross product:
{0111} X | 100 |
| 011 |
| 001 |
| 100 |
然后写一个简单方程:
- int Test ( array X)
- {
- int count=0;
- int n=-1;
- for(i=0, i<=size(X); i++)
- {
- if (X[i]==0)
- count++;
- n=i;
- };
- if (count == 1)
- return (n);
- else
- return(-1);
- }
复制代码
之前的cross运算结果是一个3位的array, 这个test方程只返回运算结果有且只有一个0那一位的序号, 如果是条件内的数列, 比如说1001, 结果是{012}, 那么方程返回 1.
结果只有一个0, 说明输入值与一种条件1的位置一致, 比如如果返回{012}, 说明输入是1XX1, 之后我们只需利用n的值(1), 来确认其他数位即可, M( * , n) 就是对应 0 的那个数列, 只要判断条件 M(*,n) (dot product) M(*,n) == I (dot product) I, 即1001 dot 1001 == 1XX1 dot 1XX1, 如果点乘结果相同说明输入值与1001有相同数量的1, 1XX1 -> 1001, 确认符合条件, 如果不相等, 说明1的数量不相等, 比如 1101或 1011.
这个算法可以避开繁琐的if判断, 便于修改维护(只需修改每个条件集的矩阵), 并且不限制输入数位的长度, 即使是100位的01序列也是一样的, 另外最好每种操作对应一个比较大的条件集, 如果每种组合对应一种操作, 其实跟用if写也没什么区别....
  |
|