流程算法

艾派德迷你2 2014-07-04 08:59:38
简单说明
我定义咯一个数组,
数组的key表示当前步的ID,下一步的ID对应的value...
我要生成一个这个新的数组
例子:
array(1 => int 7
7 => int 11
8 => int 7
9 => int 8
10 => int 11
11 => int 12
12 => NULL
)
结果就是
array(
1=>7
7=>11
11=>12
12=>NULL
)
当前知道开头位为1.

求算法...
...全文
120 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲雪星枫 2014-07-04
  • 打赏
  • 举报
回复
支持自己动手的,呵呵。 先实现,再优化。
艾派德迷你2 2014-07-04
  • 打赏
  • 举报
回复
对的... 直接出现循环就结束... 我自己慢慢折腾出来咯..不是很好看


$a = array(
    7 => 11,
    1 => 11,
    8 => 7,
    9 => 8,
    10 => 11,
    11 => 8,
    12 => NULL,
);
$firstID = 1;
$nextID = 11; //这里程序可以找到是11
//将第一位提前
$newReturnTemp[$firstID] = $nextID;
if (empty($nextID)) {
        return array($a[$firstID]);
} else {
        //重新组建数组,并让开始为为第一位
        foreach ($a as $key => $value) {
                $newReturnTemp[$key] = $value;
        }
        unset($key);
        unset($value);
        //获取数组的数目
        $stepCount = count($a);
        //提取所有键值
        $stepArray = array_keys($newReturnTemp);
        //让判断位为第一位
        $temp = $firstID;
        //组件要返回的数组第一位
        $newnew[$firstID] = $nextID;
        //将键值进行循环
        for ($i = 0; $i < $stepCount; $i++) {
                //默认从第一步开始,
                if ($temp == $stepArray[$i]) {
                        //键值数组循环后面的值
                        for ($j = $i + 1; $j < $stepCount; $j++) {
                                //判断是否找到下一级的值,依据$a的内容
                                if ($newReturnTemp[$stepArray[$i]] == $stepArray[$j]) {
                                        //找到值,写入需要返回的数组
                                        $newnew[$temp] = $stepArray[$j];
                                        //设定下一个判断值
                                        $temp = $stepArray[$j];
                                        //将键值循环的下一位与当前所返回的下一级值对换,并保证下一次判断是从下一级开始
                                        $tt = $stepArray[$j];
                                        $stepArray[$j] = $stepArray[$i + 1];
                                        $stepArray[$i + 1] = $tt;
                                        unset($tt);
                                }
                        }
                }
        }
        //将返回排序好的数组,并依据排队内容一次取出相对应的数据,这里是用$a来做演示的...
        foreach ($newnew as $key => $value) {
                $reReturn[$key] = $a[$key];
                $last = $value;
        }
        //将默认最后一位没有找到的值或者是不正确的下一级补进数组...(可以不需要这一步)
        if (isset($a[$last])) {
                $reReturn[$last] = $a[$last];
        }
}

var_dump($reReturn);
傲雪星枫 2014-07-04
  • 打赏
  • 举报
回复
你之前的结束条件是NULL,而你却写一个死循环的map,明显和约定的条件不同。 如果死循环,那么结束条件是什么?是否出现循环就直接结束?
艾派德迷你2 2014-07-04
  • 打赏
  • 举报
回复
引用 2 楼 fdipzone 的回复:

$map = array(
    1 => 7,
    7 => 11,
    8 => 7,
    9 => 8,
    10 => 11,
    11 => 12,
    12 => NULL
);

function getroad($map){
    $key = 1;
    $result = array();
    while($key!=NULL){
        $result[$key] = $map[$key];
        $key = $map[$key];
    }
    return $result;
}

$result = getroad($map);

var_export($result);
array ( 1 => 7, 7 => 11, 11 => 12, 12 => NULL, )
这个也会有死循环的问题 $map = array( 1 => 11, 7 => 11, 8 => 7, 9 => 8, 10 => 11, 11 => 8, 12 => NULL );
艾派德迷你2 2014-07-04
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
$a = array(
  1 => 7,
  7 => 11,
  8 => 7,
  9 => 8,
  10 => 11,
  11 => 12,
  12 => NULL,
);
$i = 1;
while(isset($a[$i])) {
  $r[$i] = $a[$i]; 
  $i = $a[$i];
}
$r[$i] = $a[$i]; 
var_export($r);
array ( 1 => 7, 7 => 11, 11 => 12, 12 => NULL, )
有点点问题 如果key=value就会死循环... 不过这个可以让通过程序让key!=value
傲雪星枫 2014-07-04
  • 打赏
  • 举报
回复

$map = array(
    1 => 7,
    7 => 11,
    8 => 7,
    9 => 8,
    10 => 11,
    11 => 12,
    12 => NULL
);

function getroad($map){
    $key = 1;
    $result = array();
    while($key!=NULL){
        $result[$key] = $map[$key];
        $key = $map[$key];
    }
    return $result;
}

$result = getroad($map);

var_export($result);
array ( 1 => 7, 7 => 11, 11 => 12, 12 => NULL, )
xuzuning 2014-07-04
  • 打赏
  • 举报
回复
$a = array(
1 => 7,
7 => 11,
8 => 7,
9 => 8,
10 => 11,
11 => 12,
12 => NULL,
);
$i = 1;
while(isset($a[$i])) {
$r[$i] = $a[$i];
$i = $a[$i];
}
$r[$i] = $a[$i];
var_export($r);
array (
1 => 7,
7 => 11,
11 => 12,
12 => NULL,
)
实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1. 通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及bresenham算法的基本原理; 2. 掌握以上算法生成直线段的基本过程; 3. 通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、 复习有关算法的基本原理,明确实验目的和要求; 2、 依据算法思想,绘制程序流程图; 3、 设计程序界面,要求操作方便; 4、 用C/C++语言编写源程序并调试、执行; 5、 分析实验结果 6、 对程序设计过程中出现的问题进行分析与总结; 7、 打印源程序或把源程序以文件的形式提交; 8、 按格式要求完成实验报告。 实验报告要求: 1、 各种算法的基本原理; 2、 各算法流程图 3、 实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、 实验总结(含问题分析及解决方法) 实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、 通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、 掌握以上算法生成圆和圆弧的基本过程; 3、 掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1. 复习有关圆的生成算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3. 设计程序界面,要求操作方便; 4. 用C/C++语言编写源程序并调试、执行; 5. 分析实验结果 6. 对程序设计过程中出现的问题进行分析与总结; 7. 打印源程序或把源程序以文件的形式提交; 8. 按格式要求完成实验报告。 实验报告要求: 1. 分析算法的工作原理; 2. 画出算法流程图 3. 实验结果及分析(比较圆与圆弧生成算法的不同) 4. 实验总结(含问题分析及解决方法) 实验3 多边形的区域填充 学时:2 实验类型:设计性 实验类别:专业实验 实验目的 1. 通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理 2. 掌握多边形区域填充算法的基本过程 3. 掌握在C/C++环境下用多边形填充算法编程实现指定多边形的填充。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用种子填充算法和扫描线填充算法等任意两种算法实现指定多边形的区域填充。 实验步骤 1. 复习有关算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(指定填充多边形); 3. 设计程序界面,要求操作方便; 4. 用C/C++语言编写源程序并调试、执行(最好能用动画显示填充过程); 5. 分析实验结果 6. 对程序设计过程中出现的问题进行分析与总结; 7. 打印源程序或把源程序以文件的形式提交; 8. 按格式要求完成实验报告。 实验报告要求: 1. 分析算法的工作原理; 2. 画出算法流程图 3. 实验结果及分析(比较两种算法的不同) 4. 实验总结(含问题分析及解决方法)

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧