小卡要民主(卡雷尔机器人)

小卡要民主

 佛罗里达州在2000年总统选举中出现了妇孺皆知的“残留纸屑问题”,后来大多数州都不再使用打卡投票的方法,其中,最普遍的替代方案是使用电子投票机。但即便如此却依然存在问题,正如我们在2006年大选中所见,全电子投票无法生成可用于核实的纸质票据,无法重新计票,也难以发现其中的舞弊行为。

        为了解决上述问题,可以采用一种新型方法(貌似有点异想天开),依然采用打卡投票的方式,并使用微型机器人卡雷尔检查每张选票残留的纸屑,卡雷尔的任务是检查每张选票,确保票孔没有纸屑残留。

    具体点说,假设卡雷尔位于选票最左端,如下图所示:

半闭合的矩形是每张选票的打孔区。选票上原本全部都覆盖着方块,如第28列所示。在理想的情况下,选民投出的票会打空所有的方块,得到一个空白的矩形,如第4列所示。可惜会有一些纸屑残留在洞上,如第6列所示,顶部的方块仍留在选票上。第10列的情况更糟,中间打出的方块覆盖到长方形的底部,在那儿留下了两个方块。

        假设州的立法规定,选民的投票意向由矩形中间方块的状态来决定(撞针与卡片接触的位置)。如果中间有方块,卡雷尔则认定选民没有在那一栏投票,继续检查下一张选票,假如中间没有方块,卡雷尔必须检查选票中对的其他两个位置,去除所有的方块,使得选票能被正确计数,上图正确处理后的状态应如下图所示。

你可以参考以下信息:
选票只出现在偶数列。选票的实际尺寸可能与例示不同,实际会包含任意数量的矩形选票。卡雷尔始终从最左边矩形的前一格开始,到最右边矩形的后一格结束。
如上图所示,每一份选票矩形都是1*3规格。

l  卡雷尔总是从选票矩形的左边开始,面对长方形中心线的投票孔。

l  卡雷尔结束运行时必须在选票最右边,面朝东。

注意:写一个卡雷尔程序清理孔屑,记住,你的程序不应该仅仅适用于图中的例子,而需符合所有情况。

项目:

/* 文件: VoteCountingKarel.java
* ----------------------------
* 卡雷尔的任务是检查每张选票,确保票孔没有纸屑残留
*/

import stanford.karel.*;

public class VoteCountingKarel extends SuperKarel {

public void run() {
move();
panDuan();


}
private void panDuan() {
while(frontIsClear()){

if(beepersPresent()) {
move();
move();
}
else {

turnRight();
move();
if(beepersPresent()) {
pickBeeper();
while(beepersPresent()) {
pickBeeper();}
turnAround();
move();
move();
if(beepersPresent()) {
pickBeeper();
while(beepersPresent()) {
pickBeeper();}
turnAround();
move();
turnLeft();
move();
move();
}
else {
turnAround();
turnLeft();
move();
move();
}
}
else {
turnAround();
move();
move();
if(beepersPresent()) {
pickBeeper();
while(beepersPresent()) {
pickBeeper();}
turnAround();
move();
turnLeft();
move();
move();
}
else {
turnAround();
move();
turnLeft();
move();
move();
}
}
}
}

}
}

     

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值