⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b.c

📁 This is code tutorial for image processing include:histogram,sketon....
💻 C
字号:
/*
   b.c
   Dwayne Phillips

   This program illustrates the breadth first 
   search algorithm.

   April 1999

*/


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define BLOCKED 1
#define CLEAR   0
#define H       4
#define V       4

/************************************************/


int matrix[H][V] =
   { {1, 0, 0, 0},
     {0, 0, 1, 0},
     {0, 1, 0, 0},
     {1, 0, 0, 0} };

struct node {
   int    number;
   int    x;
   int    y;
   struct node *parent;
   struct node *next;
};

/************************************************/

struct node * remove_from_list(struct node **);
struct node * new_down_node(struct node **, int);
struct node * new_left_node(struct node **, int);
struct node * new_right_node(struct node **, int);
struct node * create_new_node(int, int, int);
void add_to_list(struct node **, struct node **);
void print_node(struct node *);
void free_nodes_in_list(struct node *);
void traverse_list(struct node *);
int is_empty(struct node *);
int is_a_goal_node(struct node *);
int is_clear(struct node *);
int no_solution_exists(int *);
int can_go_downwards(struct node *);
int can_go_left(struct node *);
int can_go_right(struct node *);
int solution_found(struct node *, int *);


/************************************************/

main(int argc, char *argv[])
{
char response[80];
int stupid = 99;
   int node_number = 0,
       searching   = 1;
   struct node *CLOSED,
               *down,
               *left,
               *n,
               *OPEN,
               *right;

      /******************************************
      *
      *   Initialize this problem.
      *
      ******************************************/

   OPEN   = NULL;
   CLOSED = NULL;


   n = create_new_node(node_number, 1, 0);
   OPEN = n;
   node_number++;

   n = create_new_node(node_number, 2, 0);
   add_to_list(&OPEN, &n);
   node_number++;

   n = create_new_node(node_number, 3, 0);
   add_to_list(&OPEN, &n);
   node_number++;

      /******************************************
      *
      *   Search through the state space for 
      *   a solution.
      *
      ******************************************/

   while(searching){

      if(is_empty(OPEN))
         no_solution_exists(&searching);

      else{  /* OPEN list is not empty */

            /************************************
            *
            *   Take the first node on OPEN list
            *   and put it on the CLOSED list.
            *
            ************************************/

         n = remove_from_list(&OPEN);
         add_to_list(&CLOSED, &n);

            /************************************
            *
            *   First try to go downwards.  If 
            *   that is possible, don't expand 
            *   anymore.
            *
            ************************************/

         if(can_go_downwards(n)){
            down = new_down_node(&n, node_number);
            node_number++;
            if(is_a_goal_node(down)) 
               solution_found(down, &searching);
            else
               add_to_list(&OPEN, &down);
         }  /* ends if can_go_downwards */

            /************************************
            *
            *   If cannot go downwards, expand 
            *   left and right.
            *
            ************************************/

         else{  /* cannot go downwards */
            if(can_go_left(n)){
               left = new_left_node(&n, node_number);
               node_number++;
               if(is_clear(left))
                  add_to_list(&OPEN, &left);
            }  /* ends if can_go_left */

            if(can_go_right(n)){
               right = new_right_node(&n, node_number);
               node_number++;
               if(is_clear(right))
                  add_to_list(&OPEN, &right);
            }  /* ends if can_go_right */

         }  /* ends else cannot go downwards */

      }  /* ends else OPEN is not empty */

   }  /* ends while searching */


   free_nodes_in_list(OPEN);
   free_nodes_in_list(CLOSED);

}  /* ends main */

/************************************************/
/*
   Add a node to the end of the linked list 
   pointed to be the head pointer.
*/

void add_to_list(struct node **head, 
                 struct node **new)
{
   struct node *temp;

   if((*head) == NULL)
      (*head) = (*new);
   else{
      temp = (*head);
      while(temp->next != NULL)
         temp = temp->next;
      temp->next = (*new);
   }  /* ends else */

   (*new)->next = NULL;

}  /* ends add_to_list */

/************************************************/

void free_nodes_in_list(struct node *head)
{
   struct node *temp;

   printf("\n\nFreeing nodes in a list");
   while(head != NULL){
      temp = head;
      print_node(temp);
      head = temp->next;
      free(temp);
   }  /* ends while */
}  /* ends free_nodes_in_list */

/************************************************/

int is_empty(struct node *head)
{
   int result = 0;
   if(head == NULL)
      result = 1;
   return(result);
}  /* ends is_empty */

/************************************************/

int no_solution_exists(int *searching)
{
   *searching = 0;
   printf("\nThe OPEN list is empty, "
          "no solution exists");
   return(1);
}  /* ends no_solution_exists */

/************************************************/

void print_node(struct node *a)
{
   printf("\nNode number=%d x=%d y=%d", 
   a->number, a->x, a->y);
}  /* ends print_node */

/************************************************/

struct node * remove_from_list(struct node **head)
{
   struct node *result;

   if(*head == NULL){
      printf("\nEMPTY LIST CANNOT REMOVE ");
      exit(1);
   }  /* ends if NULL */

   result = *head;
   *head  = result->next;
   return(result);

}  /* ends remove_from_list */

/************************************************/

int can_go_downwards(struct node *n)
{
   int result = 0;

   if(matrix[n->x][n->y+1] == CLEAR)
      result = 1;
   return(result);

}  /* ends can_go_downwards */

/************************************************/

struct node * new_down_node(struct node **n, 
                            int node_number)
{
   struct node *result;

   result = create_new_node(node_number, 
                            (*n)->x, (*n)->y+1);
   result->parent = (*n);
   return(result);
}  /* ends new_down_node */

/************************************************/

int is_a_goal_node(struct node *n)
{
   int result = 0;
   if(n->y >= V-1)
      result = 1;
   return(result);
}  /* ends is_a_goal_node */


/************************************************/

int solution_found(struct node *end, 
                   int *searching)
{
   struct node *temp;

   temp       = end;
   *searching = 0;

   printf("\n\n\nHere is the solution");
   while(temp != NULL){
      print_node(temp);
      temp = temp->parent;
   }  /* ends while */

   return(1);
}  /* ends solution_found */

/************************************************/

int can_go_left(struct node *n)
{
   int result = 0;
   if(n->x > 0)
      result = 1;
   return(result);
}  /* ends can_go_left */

/************************************************/

int can_go_right(struct node *n)
{
   int result = 0;
   if(n->x < H-1)
      result = 1;
   return(result);
}  /* ends can_go_right */

/************************************************/

int is_clear(struct node *n)
{
   int result = 0;
   if(matrix[n->x][n->y] == CLEAR)
      result = 1;
   return(result);
}  /* ends is_clear */

/************************************************/

struct node * new_left_node(struct node **n, 
                            int node_number)
{
   struct node *result;

   result = create_new_node(node_number, 
                            (*n)->x-1, (*n)->y);
   result->parent = (*n);
   return(result);
}  /* ends new_left_node */

/************************************************/

struct node * new_right_node(struct node **n, 
                             int node_number)
{
   struct node *result;

   result = create_new_node(node_number, 
                            (*n)->x+1, (*n)->y);
   result->parent = (*n);
   return(result);
}  /* ends new_right_node */


/************************************************/

struct node * create_new_node(int number, 
                              int x, int y)
{
   struct node *new;
   new = (struct node *)
         calloc(1, sizeof(struct node));
   new->number = number;
   new->x      = x;
   new->y      = y;
   new->next   = NULL;
   new->parent = NULL;
   return(new);
}  /* ends create_new_node */

/************************************************/


/************************************************/


/************************************************/

void traverse_list(struct node *head)
{
   struct node *temp;

   printf("\n\nTraversing list");
   while(head != NULL){
      temp = head;
      print_node(temp);
      head = temp->next;
   }  /* ends while */
   printf("\n\n");
}  /* ends free_nodes_in_list */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -