Advertisement
wandrake

Untitled

Jun 26th, 2011
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.23 KB | None | 0 0
  1. #include "heap.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. const int eur_fun[8][9] =
  7.     { {0, 1, 2, 1, 2, 3, 2, 3, 4 },
  8.       {1, 0, 1, 2, 1, 2, 3, 2, 3 },
  9.       {2, 1, 0, 3, 2, 1, 4, 3, 2 },
  10.       {1, 2, 3, 0, 1, 2, 1, 2, 3 },
  11.       {2, 1, 2, 1, 0, 1, 2, 1, 2 },
  12.       {3, 2, 1, 2, 1, 0, 3, 2, 1 },
  13.       {2, 3, 4, 1, 2, 3, 0, 1, 2 },
  14.       {3, 2, 3, 2, 1, 2, 1, 0, 1 } };
  15.  
  16. heap_t* queue;
  17.  
  18. int euristic(status_t* s) {
  19.     int i, ret;
  20.  
  21.     ret = 0;
  22.  
  23.     for (i = 0; i < 9; i++) {
  24.         if (s->conf[i] != 0) {
  25.             ret += eur_fun[s->conf[i]-1][i];
  26.         }
  27.     }
  28.  
  29.     return ret;
  30. }
  31.  
  32. void print_status(status_t* status) {
  33.     int i = 0;
  34.  
  35.     printf("%d %d %d\n", status->conf[0], status->conf[1], status->conf[2]);
  36.     printf("%d %d %d\n", status->conf[3], status->conf[4], status->conf[5]);
  37.     printf("%d %d %d\n\n", status->conf[6], status->conf[7], status->conf[8]);
  38.  
  39.     fflush(stdout);
  40. }
  41.  
  42. int is_obiettivo(status_t* status) {
  43.     int i;
  44.  
  45.     for (i = 0; i < 8; i++) if (status->conf[i] != i+1) return 0;
  46.     return 1;
  47. }
  48.  
  49. int find_zero (unsigned short* conf) {
  50.     int i;
  51.     for (i = 0; i < 9; i++) if (conf[i] == 0) return i;
  52. }
  53.  
  54. void scambia(unsigned short* array, int a, int b) {
  55.     unsigned short tmp;
  56.  
  57.     tmp = array[a];
  58.     array[a] = array[b];
  59.     array[b] = tmp;
  60. }
  61.  
  62. status_t* calculate_solution(status_t* status) {
  63.     status_t* s;
  64.     wstatus_t* w;
  65.  
  66.     int zero;
  67.     unsigned short tmp;
  68.  
  69.     s = status;
  70.  
  71.     while (!is_obiettivo(s)) {
  72. /*        print_status(s); */
  73.         /* Calcola alternative */
  74. /*        printf("Calcolo alternative...\n"); */
  75.         zero = find_zero(s->conf);
  76.         switch (zero) {
  77.             case 0:
  78.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  79.  
  80.                 w->status = (status_t*)malloc(sizeof(status_t));
  81.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  82.                 w->status->distance = s->distance + 1;
  83.                 w->status->padre = s;
  84.  
  85.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  86.                 scambia(w->status->conf, 0, 1);
  87.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  88.  
  89.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  90.  
  91.                 w->status = (status_t*)malloc(sizeof(status_t));
  92.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  93.                 w->status->distance = s->distance + 1;
  94.                 w->status->padre = s;
  95.  
  96.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  97.                 scambia(w->status->conf, 0, 3);
  98.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  99.  
  100.                 break;
  101.             case 1:
  102.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  103.  
  104.                 w->status = (status_t*)malloc(sizeof(status_t));
  105.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  106.                 w->status->distance = s->distance + 1;
  107.                 w->status->padre = s;
  108.  
  109.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  110.                 scambia(w->status->conf, 1, 0);
  111.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  112.  
  113.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  114.  
  115.                 w->status = (status_t*)malloc(sizeof(status_t));
  116.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  117.                 w->status->distance = s->distance + 1;
  118.                 w->status->padre = s;
  119.  
  120.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  121.                 scambia(w->status->conf, 1, 2);
  122.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  123.  
  124.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  125.  
  126.                 w->status = (status_t*)malloc(sizeof(status_t));
  127.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  128.                 w->status->distance = s->distance + 1;
  129.                 w->status->padre = s;
  130.  
  131.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  132.                 scambia(w->status->conf, 1, 4);
  133.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  134.                 break;
  135.             case 2:
  136.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  137.  
  138.                 w->status = (status_t*)malloc(sizeof(status_t));
  139.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  140.                 w->status->distance = s->distance + 1;
  141.                 w->status->padre = s;
  142.  
  143.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  144.                 scambia(w->status->conf, 2, 1);
  145.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  146.  
  147.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  148.  
  149.                 w->status = (status_t*)malloc(sizeof(status_t));
  150.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  151.                 w->status->distance = s->distance + 1;
  152.                 w->status->padre = s;
  153.  
  154.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  155.                 scambia(w->status->conf, 2, 5);
  156.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  157.  
  158.                 break;
  159.             case 3:
  160.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  161.  
  162.                 w->status = (status_t*)malloc(sizeof(status_t));
  163.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  164.                 w->status->distance = s->distance + 1;
  165.                 w->status->padre = s;
  166.  
  167.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  168.                 scambia(w->status->conf, 3, 0);
  169.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  170.  
  171.  
  172.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  173.  
  174.                 w->status = (status_t*)malloc(sizeof(status_t));
  175.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  176.                 w->status->distance = s->distance + 1;
  177.                 w->status->padre = s;
  178.  
  179.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  180.                 scambia(w->status->conf, 3, 4);
  181.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  182.  
  183.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  184.  
  185.                 w->status = (status_t*)malloc(sizeof(status_t));
  186.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  187.                 w->status->distance = s->distance + 1;
  188.                 w->status->padre = s;
  189.  
  190.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  191.                 scambia(w->status->conf, 3, 6);
  192.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  193.                 break;
  194.             case 4:
  195.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  196.  
  197.                 w->status = (status_t*)malloc(sizeof(status_t));
  198.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  199.                 w->status->distance = s->distance + 1;
  200.                 w->status->padre = s;
  201.  
  202.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  203.                 scambia(w->status->conf, 4, 1);
  204.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  205.  
  206.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  207.  
  208.                 w->status = (status_t*)malloc(sizeof(status_t));
  209.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  210.                 w->status->distance = s->distance + 1;
  211.                 w->status->padre = s;
  212.  
  213.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  214.                 scambia(w->status->conf, 4, 3);
  215.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  216.  
  217.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  218.  
  219.                 w->status = (status_t*)malloc(sizeof(status_t));
  220.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  221.                 w->status->distance = s->distance + 1;
  222.                 w->status->padre = s;
  223.  
  224.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  225.                 scambia(w->status->conf, 4, 5);
  226.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  227.  
  228.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  229.  
  230.                 w->status = (status_t*)malloc(sizeof(status_t));
  231.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  232.                 w->status->distance = s->distance + 1;
  233.                 w->status->padre = s;
  234.  
  235.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  236.                 scambia(w->status->conf, 4, 7);
  237.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  238.  
  239.                 break;
  240.             case 5:
  241.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  242.  
  243.                 w->status = (status_t*)malloc(sizeof(status_t));
  244.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  245.                 w->status->distance = s->distance + 1;
  246.                 w->status->padre = s;
  247.  
  248.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  249.                 scambia(w->status->conf, 5, 2);
  250.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  251.  
  252.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  253.  
  254.                 w->status = (status_t*)malloc(sizeof(status_t));
  255.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  256.                 w->status->distance = s->distance + 1;
  257.                 w->status->padre = s;
  258.  
  259.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  260.                 scambia(w->status->conf, 5, 4);
  261.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  262.  
  263.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  264.  
  265.                 w->status = (status_t*)malloc(sizeof(status_t));
  266.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  267.                 w->status->distance = s->distance + 1;
  268.                 w->status->padre = s;
  269.  
  270.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  271.                 scambia(w->status->conf, 5, 8);
  272.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  273.  
  274.                 break;
  275.             case 6:
  276.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  277.  
  278.                 w->status = (status_t*)malloc(sizeof(status_t));
  279.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  280.                 w->status->distance = s->distance + 1;
  281.                 w->status->padre = s;
  282.  
  283.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  284.                 scambia(w->status->conf, 6, 3);
  285.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  286.  
  287.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  288.  
  289.                 w->status = (status_t*)malloc(sizeof(status_t));
  290.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  291.                 w->status->distance = s->distance + 1;
  292.                 w->status->padre = s;
  293.  
  294.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  295.                 scambia(w->status->conf, 6, 7);
  296.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  297.  
  298.                 break;
  299.             case 7:
  300.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  301.  
  302.                 w->status = (status_t*)malloc(sizeof(status_t));
  303.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  304.                 w->status->distance = s->distance + 1;
  305.                 w->status->padre = s;
  306.  
  307.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  308.                 scambia(w->status->conf, 7, 4);
  309.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  310.  
  311.  
  312.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  313.  
  314.                 w->status = (status_t*)malloc(sizeof(status_t));
  315.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  316.                 w->status->distance = s->distance + 1;
  317.                 w->status->padre = s;
  318.  
  319.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  320.                 scambia(w->status->conf, 7, 6);
  321.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  322.  
  323.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  324.  
  325.                 w->status = (status_t*)malloc(sizeof(status_t));
  326.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  327.                 w->status->distance = s->distance + 1;
  328.                 w->status->padre = s;
  329.  
  330.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  331.                 scambia(w->status->conf, 7, 8);
  332.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  333.  
  334.                 break;
  335.             case 8:
  336.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  337.  
  338.                 w->status = (status_t*)malloc(sizeof(status_t));
  339.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  340.                 w->status->distance = s->distance + 1;
  341.                 w->status->padre = s;
  342.  
  343.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  344.                 scambia(w->status->conf, 8, 5);
  345.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  346.  
  347.                 w = (wstatus_t*)malloc(sizeof(wstatus_t));
  348.  
  349.                 w->status = (status_t*)malloc(sizeof(status_t));
  350.                 w->status->conf = (unsigned short*)malloc(9*sizeof(unsigned short));
  351.                 w->status->distance = s->distance + 1;
  352.                 w->status->padre = s;
  353.  
  354.                 memcpy(w->status->conf, s->conf, 9*sizeof(unsigned short));
  355.                 scambia(w->status->conf, 8, 7);
  356.                 heap_add(queue, w, w->status->distance + euristic(w->status));
  357.                 break;
  358.         }
  359.         /* Calcola peso */
  360.         /* Inserisci in coda */
  361.         /* Estrai dalla coda */
  362.         heap_heapify(queue, 0);
  363. /*        heap_print(queue); */
  364. /*        printf("\n"); */
  365.         w = heap_extract(queue);
  366.         s = w->status;
  367.     }
  368.  
  369.     return s;
  370. }
  371.  
  372. int main (int argc, char* argv[]) {
  373.     status_t* start;
  374.     status_t* sol;
  375. /*     unsigned short conf[9] = {1, 2, 3, 4, 5, 6, 0, 7, 8}; */
  376. /*    unsigned short conf[9] = {4, 7, 8, 3, 2, 1, 5, 6, 0}; */
  377. /*    unsigned short conf[9] = {6, 2, 3, 5, 7, 4, 0, 1, 8}; */
  378. /*    unsigned short conf[9] = {4, 7, 8, 2, 6, 3, 1, 5, 0}; */
  379.     unsigned short conf[9] = {7, 6, 0, 4, 2, 1, 8, 5, 3};
  380.  
  381.     queue = heap_new();
  382.     start = (status_t*)malloc(sizeof(status_t));
  383.  
  384.     start->conf = (unsigned short*)conf;
  385.     start->distance = 0;
  386.     start->padre = NULL;
  387.  
  388.     sol = calculate_solution(start);
  389.  
  390.     do {
  391.         print_status(sol);
  392.         sol = sol->padre;
  393.     } while (sol != NULL);
  394.  
  395.     return 0;
  396. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement