问题求解与程序设计

 问题提出时,想要利用计算机进行求解,而一般计算机不会分析问题并直接给出解决问题的方案,故我们个人需要分析问题并给出问题的解决方案,再将其描述成计算机能识别的指令(程序),让计算机进行复杂处理,最终得到问题结果,在这一过程中,计算机确起着非常重要的作用,但是要是没有前面的一系列步骤,也不能解决问题

程序设计的一般过程如图所示

由问题到想法的过程,需要分析待处理的数据以及数据之间的关系,抽象出数据类型,形成基本解题思路。对于数值型问题抽象出来的数据模型一般是数学方程,而非数值类型的问题抽象出来的数据模型一般是表、树、图等数据结构

由想法到算法的过程,需要将人的想法描述成算法(设计算法),即从计算机的角度去思考其是如何一步一步完成任务的,需要考虑数据在计算机上是如何表示(存储)和处理的,将数据模型从机外表示转化为机内表示,描述问题求解的基本思路,将问题的解决想法描述成算法

由算法到程序的过程,需要根据程序设计语言语法,在计算机中对数据进行处理

 程序=数据结构+算法(将问题抽象出一个适当的数据结构,然后基于数据结构设计一个好算法)

 以七桥问题为例来说明

 哥尼斯堡,城中有一座岛,有两条支流绕其旁,并将整个城市分为北区、东区、南区和岛区4个区域,全城共有七座桥将四个城区连接起来,如图所示,有个人提出一个问题:一个步行者怎样才能不重复、不遗漏地一次走完七座桥,最后回到出发点

  A B C D
A 0 1 2 2
B 1 0 1 1
C 2 1 0 0
D 2 1 0 0

 

想法:如图所示,将城区抽象为顶点,用A,B,C,D表示4个城区,将桥抽象为边,用7条边表示7座桥,抽象出七桥问题的数据模型如图4所示,从而将七桥问题抽象为一个数学问题:球经过图中每一条边一次且仅一次的回路,后来人们称之为欧拉回路。欧拉回路判定规则是,:

(1)如果没有一个城区通奇数桥,则无论从哪里出发都能找到欧拉回路

(2)如果通奇数桥的城区多于两个,则不存在欧拉回路

(3)如果只有两个城区通奇数桥,则不存在欧拉回路,但可以从这两个城区之一出发准哦到欧拉路径

由上述判定规则得到求解七桥问题的基本思路:依次计算与每个顶点相关联的边数,根据边数为奇数的个数来判定是否存在欧拉回路

算法:将顶点A、B、C、D编号为0,1,2,3,用二维数组array[4][4]存储七桥问题的数据模型,如果将顶点i(0<=i<=3),和顶点j(0<=j<=3)之间有k条边,则元素array[i][j]的值为k,如图所示,求解七桥问题的关键是求与每个顶点的相关联的边数,即是在二维数组array[4][4]中求每一行元素之和,算法如下:

算法:EulerCircuit

输入:二维数组array[4][4]

输出:通奇数桥的顶点个数count

         1.count初始化为0;

         2.下标i从0~n-1重复执行下述操作:
                 2.1  计算第i行元素之和degree

                 2.2  如果degree为奇数,则count++;

         3.返回count  ;

 程序:

#include<stdio.h>

int EulerCircuit(int array[4][4],int n) ;//函数声明,求通奇数桥的顶点个数

int main(){

         int array[4][4]  ={(0,1,2,2),(1,0,1,1),(2,1,0,0),(2,1,0,0)} ;

        int num = EulerCircuit(arrary,4);

          if(num>=2){

                    printf("有%d个地方通奇数桥,不存在欧拉回路\n",num);

          else 

                  printf("存在欧拉回路\n");

                          return 0;

     }

int  EulerCircuit(int array[4][4],int n){

                   int i,j,degree,count = 0 ;

                   for(i = 0 ;i < n  ; i++  ){

                      degree = 0 ;

                     for(j = 0 ; j < n ; j++){

                        degree=degree+array[i][j];

                   }

                     if(degree%2!=0)

                           count++;

              } 

                return    count ;

}

 

posted @ 2019-07-31 07:27  箫燕轩剑韵  阅读(669)  评论(1编辑  收藏  举报