```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 ``` ```#include #include #define N 9 #define B 3//square root of N using namespace std; typedef int STATUS; typedef list FRINGE; typedef void (FRINGE::*COMBINER)(FRINGE::const_reference); void report(STATUS* s) { for (int i=0; i*combiner)(newStatus); } } } void search(FRINGE* fringe, COMBINER combiner, bool findAll) { if (fringe->size()!=0) { STATUS* s=fringe->front(); fringe->pop_front(); if (goal(s)) { report(s); if (!findAll) { while (!fringe->empty()) { STATUS* tmp=fringe->front(); fringe->pop_front(); delete tmp; } } } else expand(fringe, s, combiner); delete s; search(fringe, combiner, findAll); } } int main () { int problem[]={ 1,0,0,0,0,7,0,9,0, 0,3,0,0,2,0,0,0,8, 0,0,9,6,0,0,5,0,0, 0,0,5,3,0,0,9,0,0, 0,1,0,0,8,0,0,0,2, 6,0,0,0,0,4,0,0,0, 3,0,0,0,0,0,0,1,0, 0,4,0,0,0,0,0,0,7, 0,0,7,0,0,0,3,0,0}; STATUS* s=new STATUS[N*N]; for (int i=0; ipush_back(s); //search(fringeP, &FRINGE::push_front, true); //depth-first search search(fringeP, &FRINGE::push_back, true); //breadth-first search return 0; } ```
 ```1 2 3 4 5 6 7 8 9 10 ``` ```162857493 534129678 789643521 475312986 913586742 628794135 356478219 241935867 897261354 ```