嵌套循环和重复结果?

时间:2011-06-06 18:57:15

标签: javascript actionscript-3 math air

在您说这是一个老问题之前,我花了24小时试图解决并阅读所有内容。我发誓。

代码应该接收一个系统ID,然后在所有方向上扫描该系统,每个方向都有自己的长度。这就像扫描一个围绕该系统的矩形,其中9 * 9 = 81个系统。

代码运作良好;但问题。我得到8个重复的结果,结果中缺少一个完整的行。正好位于中间一排。我认为问题出在topsystem整数但我不知道它有什么问题。

这是代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" verticalAlign="middle">


<mx:Script>
    <![CDATA[


        private function startscan():void {
            var startsystem:int = int(system.text);
            var resultsys:String = systemsaround.text;
            var leftsystem:int = -4;
            var rightsystem:int = 4;
            var topsystem:int = -400;
            var downsystem:int = 400;
            var mediumsys:int = 0;
            var tempdownsystem:int = 0;
            var temptopsystem:int = 0;


            if(startsystem + downsystem > 10000){
                downsystem = 400 -((startsystem + downsystem) - 10000);
                downsystem = Math.floor(downsystem/100)*100;
                topsystem = topsystem - (400 - downsystem);
            }
            if(startsystem + topsystem < 1){
                topsystem = -400 + (1+(-1*(startsystem + topsystem)));
                topsystem = Math.ceil(topsystem/100)*100;
                downsystem = downsystem + (400 - (topsystem * -1));
            }
            if(startsystem + leftsystem < 1){
                leftsystem = -4 + (1+(-1*(startsystem + leftsystem)));
                rightsystem = rightsystem + (4 - (leftsystem * -1));
            }
            if(startsystem + rightsystem > 10000){
                rightsystem = 4 -((startsystem + rightsystem) - 10000);
                leftsystem = leftsystem - (4 - rightsystem);
            }

            resultsys = systemsaround.text;
            systemsaround.text = resultsys + "down" + downsystem + "top" + topsystem + "left" + leftsystem + "right" + rightsystem + ":" + startsystem + "\r";
            resultsys = systemsaround.text;

            while (rightsystem > 0) {
            resultsys = systemsaround.text;
            mediumsys = startsystem + rightsystem;
            systemsaround.text = resultsys + mediumsys + "\r";
            resultsys = systemsaround.text;
            tempdownsystem = downsystem;
            temptopsystem = topsystem;
            rightsystem--;

                        while (downsystem > 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + downsystem;
                            systemsaround.text = resultsys + mediumsys + "\r";
                            resultsys = systemsaround.text;

                            downsystem = downsystem - 100;


                        }
                        while (topsystem < 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + topsystem;
                            systemsaround.text = resultsys + mediumsys + "\r";
                            resultsys = systemsaround.text;

                            topsystem = topsystem + 100;


                        }
            downsystem = tempdownsystem;        
            topsystem = temptopsystem;


            }





            while (leftsystem < 0) {
            resultsys = systemsaround.text;
            mediumsys = startsystem + leftsystem;
            systemsaround.text = resultsys + mediumsys + "\r";
            resultsys = systemsaround.text;
            tempdownsystem = downsystem;
            temptopsystem = topsystem;
            leftsystem++;
                        while (downsystem > 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + downsystem;
                            systemsaround.text = resultsys + mediumsys + "\r";
                            resultsys = systemsaround.text;

                            downsystem = downsystem - 100;


                        }
                        while (topsystem < 0) {
                            resultsys = systemsaround.text;
                            mediumsys = mediumsys + topsystem;
                            systemsaround.text = resultsys + mediumsys + "\r";
                            resultsys = systemsaround.text;

                            topsystem = topsystem + 100;


                        }
            downsystem = tempdownsystem;        
            topsystem = temptopsystem;  



            }

                        while (downsystem > 0) {
                            resultsys = systemsaround.text;
                            mediumsys = startsystem + downsystem;
                            systemsaround.text = resultsys + mediumsys + "\r";
                            resultsys = systemsaround.text;

                            downsystem = downsystem - 100;


                        }
                        while (topsystem < 0) {
                            resultsys = systemsaround.text;
                            mediumsys = startsystem + topsystem;
                            systemsaround.text = resultsys + mediumsys + "\r";
                            resultsys = systemsaround.text;

                            topsystem = topsystem + 100;


                        }






        }
    ]]>
</mx:Script>


    <mx:VBox width="488" height="304" horizontalCenter="0" verticalCenter="-16" horizontalAlign="center" verticalAlign="middle">
        <mx:TextInput id="system" text="3375"/>
        <mx:TextArea width="80%" height="228" fontSize="10" id="systemsaround"/>
        <mx:Button label="start"  click="startscan()" id="start"/>
    </mx:VBox>

</mx:WindowedApplication>

如果您将起始系统提供为3375,则会获得81个结果,其中包含8个重复项:

  • 3379 3378 3377 3376 3371 3372 3373 3374

缺少的数字是(8缺失):

  • 3279 3278 3277 3276 3274 3273 3272 3271

我希望有人能指出我正确的方向。感谢。

更新:

如果您观看具有if语句的代码部分。这部分处理边缘。特别是零和10k。关于我想做什么。把它想象成一个长方形的9 * 9点场。有9行9列。每个点的id为1到10k。输入是字段中心点的id(第5列,第5行)。就像现在我知道这个中心点id。我想循环遍历整个字段,使用topsystem(中心点到上边缘之间的距离)找到其他点ID。下降系统(中心点到下边缘之间的距离).leftsystem(中心点和中心点之间的距离)左边缘.rightsystem(中心点和右边缘之间的距离)。

代码工作正常,但有8个缺少的id被8个重复的id替换。我不知道他们来自哪里。

1 个答案:

答案 0 :(得分:1)

我不确定你要做什么,所以让我解释你想要做的想法

您有10000个“系统”排列在100x100网格中。给定一个系统编号,您希望输出它周围的所有81个系统编号。除了网格的边缘,您不想输出它们。

在这种情况下,请删除所有代码并尝试此操作:

var x = int(system.text)%100;
var y = Math.floor(int(system.text)/100);
for(var dx=-4; dx <= 4; dx++)
for(var dy=-4; dy <= 4; dy++) 
  if(0 <= x+dx && x+dx <= 100 && 0 <= y+dy && y+dy <= 100)
    systemsarround.text += x+dx + (y+dy)*100 + "\r";

这是未经测试的,但你明白了。

另一次尝试:

var x = int(system.text)%100;
var y = Math.floor(int(system.text)/100);
for(var dx=-4; dx <= 4; dx++)
for(var dy=-4; dy <= 4; dy++){
  var sys = x+dx + (y+dy)*100;
  if(1 <= sys && sys <= 10000)
    systemsarround.text += sys + "\r";
}