poj1147 Binary Codes

这道题真的很经典!

首先我们只知道矩阵的最近一列,但我们容易得出矩阵的第一列——若有‘0’,刚应该全在第一列的前面。例如

5

1 0 0 1 0

 

0 0 0 1 1

0 0 1 1 0

0 1 1 0 0

1 0 0 0 1

1 1 0 0 0

 

然后就是必须理解,假设第一列的三个‘0’是不同的,那么在最后一列,他们的相对顺序也是不变的,可以这样理解,也就是将前三行分别右移一位,‘0’也就到最后一列了,但这三行的相对大小不小,呵呵。。。‘1’也是一样的!

 

设first, last分别为第一列,最后一列,向量next为first, last元素之间的对应关系,例如上述矩阵

first=(0, 0, 0 , 1, 1)

 

last=(1, 0, 0, 1, 0)

 

注:下标从‘0’开始, 相同颜色代表对应!

向量next=(1,2,4,0,3)

 

因为矩阵右移一位后, first 就可以到last的右边了; first[i] = last[next[i]]; 这个式子就是对应关系! 然后就可以直接结果了, 第一行第一个元素为 first[0], 第二个元素在第一个基础上得到为first[next[0]](first列中第0号元素对应对应last列第next[0]号元素,取后者右端元素,在第一列,即first[next[0]])......

 

例如上述测试数据

 

k=0

k = next[k]  k=1 

k = next[k]  k=2

...                k=4

....               k=3

 

结果为0 0 0 1 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值