拼图初始化算法实现

定理:图形A与图形B等价的充要条件图形A的排列的逆序数加上0元素行号和列号的奇偶性等于图形B的排列的逆序数加上0元素行号和列号的奇偶性。为方便表述,把图形排列的逆序数加上0元素行号和列号的奇偶性称为图形的奇偶性。(参考http://www.cppblog.com/lemene/archive/2007/10/04/33405.html)

排列 1 3 2 6 0 5 4 7 8,它的逆序数为8,0元素行号为2,列号为2。逆序数加行号,列号的奇偶性为偶。
排列 1 2 3 4 5 6 7 8 0,它的逆序数为8,0元素行号为3,列号为3。逆序数加行号,列号的奇偶性为偶。两个图形的奇偶性相同,根据定理判断它们等价。


static void shuffle(int size, int *a){ //打乱数组顺序
for (int i=0; i<size; i++) {
int r = arc4random()%size;
int t = a[i];
a[i] = a[r];
a[r] = t;
}
}

static bool parityCheck(int length, int *a){
//返回数组的排列的逆序数加上0元素行号和列号的奇偶性,true为偶,false为奇。
int v = 0;
int zeroIndex = -1;
for(int i=0; i<length; i++){
for(int j=i+1; j<length; j++){
if(a[i]>a[j]){
v++;
}
}
if(a[i] == 0) zeroIndex = i;
}
int lineIndex = zeroIndex/COLS+1;
int colIndex = zeroIndex%COLS+1;

return (lineIndex + colIndex + v) % 2 == 0;

}



for (int i=0; i<NODE_COUNT; i++) {
nodes[i] = i;
}

shuffle(NODE_COUNT, nodes);
if (parityCheck(NODE_COUNT, nodes) != parityCheck(NODE_COUNT, target)) {
//若不满足定理,则交换数组最后两个值,使其奇偶性改变。
int i = nodes[NODE_COUNT-2];
nodes[NODE_COUNT-2] = nodes[NODE_COUNT-1];
nodes[NODE_COUNT-1] = i;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值