cashiba 发表于 2017-1-23 15:23:56

这样的排列组合算法怎样写代码[已解决]

本帖最后由 cashiba 于 2017-1-24 21:14 编辑


获取窗口的状态.
WinGetState("标题"[, "文本"])
返 回 值
成功: 返回一个指示窗口状态的值. 使用 BitAND() 将多个状态值相加检查所需窗口的状态:
    $WIN_STATE_EXISTS (1) = 窗口存在
    $WIN_STATE_VISIBLE (2) = 窗口可见
    $WIN_STATE_ENABLED (4) = 窗口激活
    $WIN_STATE_ACTIVE (8) = 窗口处于活动状态
    $WIN_STATE_MINIMIZED (16) = 窗口最小化
    $WIN_STATE_MAXIMIZED (32) = 窗口最大化
失败: 返回 0, @error 设置为 1, 未找到目标窗口.
如上,窗口的状态有若干种,反映到数值上的话就是穷举上面的各种基本状态的排列组合(数字累加),其中要排除相克的情况,比喻MINIMIZED与MAXIMIZED不能相加,VISIBLE与MINIMIZED不能相加
想用代码反应这种过程和结果,却不知道怎么下手......#include <Array.au3>

local $arr=[,,,,,]
_ArrayDisplay($arr)好像要用到高数的排列组合算法?
{:face (396):}

1361739590 发表于 2017-1-23 15:29:28

这不是 2的次方么

cashiba 发表于 2017-1-23 15:39:33

这不是 2的次方么
1361739590 发表于 2017-1-23 15:29 http://www.autoitx.com/images/common/back.gif
如果归结到6个字符串,穷举起组合(单独,两两,三三,四四,五五,全部),并排除相克情况,怎么得到最终结果呢?虽然觉得不难,但是不知道怎么入手....
{:face (382):}

1361739590 发表于 2017-1-23 16:54:56

只能想到按照2的次方来算,从最大的开始,或者中间开始。
15=2的3次+2的2次+2的1次+2的0次
64超范围了。

liuyilun 发表于 2017-1-23 16:55:40

$a = WinGetState("")
$result = ""
For $i = 0 To 5
        If BitAND($a, 2 ^ $i) Then $result &= 2 ^ $i & "+"
Next
MsgBox(0, 0, StringTrimRight($result, 1))

cashiba 发表于 2017-1-23 20:59:54

回复 5# liuyilun
感谢关注....

这个结果是说能穷举出多少种可能吗?

cashiba 发表于 2017-1-23 21:12:22

我想把穷举的各种组合生成一个二维数组(状态值,组合),这样的话,根据返回的状态值就可以知道窗口的具体状态
比喻说如果窗口的状态值是:47,数组中对应的组合是:存在+可见+激活+活动+最大化
怎样用代码写出这种穷举过程呢
{:face (382):}

1361739590 发表于 2017-1-24 09:24:35

回复 7# cashiba


    方法多了。
都已经知道 47=2^0+2^1+2^2+2^3+2^5 了
2^0=存在
2^1=可见
2^2=激活
2^3=活动
2^5=最大化
再想想看。

再说了,不一定需要生成一个二维数组,这样的话每次都要提前算好所有的值,太浪费了,除非是一次性定义好的,但是好像和你想的不太一样。

liuyilun 发表于 2017-1-24 09:42:36

本帖最后由 liuyilun 于 2017-1-24 09:51 编辑

回复 6# cashiba


    这已经是当前窗口的状态了,只要把结果对应的数字替换成对应的状态就行了#include <Array.au3>
$a = WinGetState("")
$result = ""
Local $arr=[,,,,,]
For $i = 0 To 5
      If BitAND($a, 2 ^ $i) Then $result &= $arr[$i] & "+"
Next
MsgBox(0, 0, StringTrimRight($result, 1))

cashiba 发表于 2017-1-24 13:06:19

回复cashiba
方法多了。
都已经知道 47=2^0+2^1+2^2+2^3+2^5 了
2^0=存在
2^1=可见
2^2=激 ...
1361739590 发表于 2017-1-24 09:24 http://www.autoitx.com/images/common/back.gif嗯,就事论事,最常见的组合也就是47,5,17,22等几个,不需要专门写啥代码.....就是突然感觉这类的穷举组合(假如说没有这些数字规律的话)有些不好入手,面面俱到的,似乎得有多个if嵌套才行
{:face (332):}

cashiba 发表于 2017-1-24 13:09:00

回复cashiba
这已经是当前窗口的状态了,只要把结果对应的数字替换成对应的状态就行了
liuyilun 发表于 2017-1-24 09:42 http://www.autoitx.com/images/common/back.gif
感谢!
你提醒我了,数字不重复递减替换,倒是一个好办法.....
{:face (88):}

1361739590 发表于 2017-1-24 17:04:08

回复 11# cashiba


    没懂你的意思。

cashiba 发表于 2017-1-24 21:05:33

回复cashiba
没懂你的意思。
1361739590 发表于 2017-1-24 17:04 http://www.autoitx.com/images/common/back.gif

local $arr=[,,,,,]

我的意思是如上
Exi,Vis,Ena,Act,Min,Max这6个字符串,任意一个或二、三、四、五个或全部,互相组合成新字符串,但相克的Vis与Min,或Max与Min,不能同时出现在一个字符串里。每个新字符串的对应项就是
对应数字(不一定就是有规律的2的n次方)的相加值

cashiba 发表于 2017-1-24 21:16:38

只是偶尔想到,这种组合情况如何用代码写出来,感觉不好写,所以才有此一问。可能是表达不清楚吧,结果都盯在了2的n次方上喽
不是要亟待解决啥实际问题,所以就不浪费大家的时间了
不过还是有收获的.....感谢大家惠顾,感谢.....
{:face (88):}
页: [1]
查看完整版本: 这样的排列组合算法怎样写代码[已解决]