找回密码
 加入
搜索
查看: 3246|回复: 13

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

  [复制链接]
发表于 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[6][2]=[[1,"Exi"],[2,"Vis"],[4,"Ena"],[8,"Act"],[16,"Min"],[32,"Max"]]
_ArrayDisplay($arr)
好像要用到高数的排列组合算法?
发表于 2017-1-23 15:29:28 | 显示全部楼层
这不是 2的次方么
 楼主| 发表于 2017-1-23 15:39:33 | 显示全部楼层
这不是 2的次方么
1361739590 发表于 2017-1-23 15:29

如果归结到6个字符串,穷举起组合(单独,两两,三三,四四,五五,全部),并排除相克情况,怎么得到最终结果呢?虽然觉得不难,但是不知道怎么入手....
发表于 2017-1-23 16:54:56 | 显示全部楼层
只能想到按照2的次方来算,从最大的开始,或者中间开始。
15=2的3次+2的2次+2的1次+2的0次
64超范围了。
发表于 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))
 楼主| 发表于 2017-1-23 20:59:54 | 显示全部楼层
回复 5# liuyilun
感谢关注....

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2017-1-23 21:12:22 | 显示全部楼层
我想把穷举的各种组合生成一个二维数组(状态值,组合),这样的话,根据返回的状态值就可以知道窗口的具体状态
比喻说如果窗口的状态值是:47,数组中对应的组合是:存在+可见+激活+活动+最大化
怎样用代码写出这种穷举过程呢
发表于 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=最大化
再想想看。

再说了,不一定需要生成一个二维数组,这样的话每次都要提前算好所有的值,太浪费了,除非是一次性定义好的,但是好像和你想的不太一样。
发表于 2017-1-24 09:42:36 | 显示全部楼层
本帖最后由 liuyilun 于 2017-1-24 09:51 编辑

回复 6# cashiba


    这已经是当前窗口的状态了,只要把结果对应的数字替换成对应的状态就行了
#include <Array.au3>
$a = WinGetState("")
$result = ""
Local $arr[6][2]=[[1,"Exi"],[2,"Vis"],[4,"Ena"],[8,"Act"],[16,"Min"],[32,"Max"]]
For $i = 0 To 5
        If BitAND($a, 2 ^ $i) Then $result &= $arr[$i][1] & "+"
Next
MsgBox(0, 0, StringTrimRight($result, 1))
 楼主| 发表于 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
嗯,就事论事,最常见的组合也就是47,5,17,22等几个,不需要专门写啥代码.....就是突然感觉这类的穷举组合(假如说没有这些数字规律的话)有些不好入手,面面俱到的,似乎得有多个if嵌套才行
 楼主| 发表于 2017-1-24 13:09:00 | 显示全部楼层
回复  cashiba
这已经是当前窗口的状态了,只要把结果对应的数字替换成对应的状态就行了
liuyilun 发表于 2017-1-24 09:42

感谢!
你提醒我了,数字不重复递减替换,倒是一个好办法.....
发表于 2017-1-24 17:04:08 | 显示全部楼层
回复 11# cashiba


    没懂你的意思。
 楼主| 发表于 2017-1-24 21:05:33 | 显示全部楼层
回复  cashiba
没懂你的意思。
1361739590 发表于 2017-1-24 17:04
local $arr[6][2]=[[3,"Exi"],[4,"Vis"],[5,"Ena"],[6,"Act"],[7,"Min"],[8,"Max"]]

我的意思是如上
Exi,Vis,Ena,Act,Min,Max这6个字符串,任意一个或二、三、四、五个或全部,互相组合成新字符串,但相克的Vis与Min,或Max与Min,不能同时出现在一个字符串里。每个新字符串的对应项就是
对应数字(不一定就是有规律的2的n次方)的相加值
 楼主| 发表于 2017-1-24 21:16:38 | 显示全部楼层
只是偶尔想到,这种组合情况如何用代码写出来,感觉不好写,所以才有此一问。可能是表达不清楚吧,结果都盯在了2的n次方上喽
不是要亟待解决啥实际问题,所以就不浪费大家的时间了
不过还是有收获的.....感谢大家惠顾,感谢.....
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-28 01:58 , Processed in 0.085753 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表