zoukankan      html  css  js  c++  java
  • 八皇后-递归

    重写八皇后,最开始用双层循环,然后用递归重写,还是递归易懂,优雅

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <math.h>
      5 #include "stack_seq_generic.h"
      6 
      7 #define QUEEN 4
      8 
      9 typedef struct{
     10     int x;
     11     int y;
     12 } Point;
     13 
     14 BOOL in_border(int x){
     15     if (x>=0 && x<QUEEN) {
     16         return TRUE;
     17     }
     18     return FALSE;
     19 }
     20 
     21 BOOL can_place(SqStack *s, Point *p){
     22     Point *top = (Point *)s->top;
     23     Point *base = (Point *)s->base;
     24     
     25     if (!in_border(p->x) || !in_border(p->y)) {
     26         return FALSE;
     27     }
     28     
     29     while (base < top) {
     30         int x_dif = abs(p->x - base->x);
     31         int y_dif = abs(p->y - base->y);
     32         
     33         if (base->y==p->y || x_dif==y_dif) {
     34             return FALSE;
     35         }
     36         base++;
     37     }
     38     return TRUE;
     39 }
     40 
     41 static int count = 0;
     42 
     43 void print_queens(SqStack *s){
     44     Point *top = s->top;
     45     Point *base = s->base;
     46     
     47     char area[QUEEN][QUEEN] = {0};
     48     memset(area, '*', sizeof(char)*QUEEN*QUEEN);
     49     
     50     if (top - base >= QUEEN) {
     51         while (base < top) {
     52             area[base->x][base->y] = '#';
     53             base++;
     54         }
     55         
     56         int i,j;
     57         for (i=0; i<QUEEN; i++) {
     58             for (j=0; j<QUEEN; j++) {
     59                 printf("%c ", area[i][j]);
     60             }
     61             printf("
    ");
     62         }
     63         printf("
    ");
     64         
     65         count++;
     66     }
     67     
     68 }
     69 
     70 void queens_recursion(SqStack *s, Point p){
     71     if (can_place(s, &p)) {
     72         push(s, &p);
     73         print_queens(s);
     74         Point next = {p.x+1, 0};
     75         queens_recursion(s, next);
     76     }else{
     77         if (stack_empty(s)) {
     78             return;
     79         }
     80         
     81         if (!in_border(p.y) || !in_border(p.x)){
     82             pop(s, &p);
     83             Point next = {p.x, p.y+1};
     84             queens_recursion(s, next);
     85         }else{
     86             Point next = {p.x, p.y+1};
     87             queens_recursion(s, next);
     88         }
     89         
     90     }
     91 }
     92 
     93 int main(void){
     94     SqStack stack;
     95     init_stack(&stack, sizeof(Point));
     96     
     97     //queens(&stack);
     98     Point p = {0, 0};
     99     queens_recursion(&stack, p);
    100 
    101     printf("total:%d
    ", count);
    102     
    103     return 0;
    104 }
  • 相关阅读:
    搜索旋转排序数组
    SpringBoot整合mybatis
    《浪潮之巅》阅读笔记01
    阅读杂记01
    go home or stand up
    关于URL编码/javascript/js url 编码(轉)
    水晶报表 相关。
    Format函数(转)
    asp 亂碼問題。
    圣人不死,大盗不止
  • 原文地址:https://www.cnblogs.com/peer/p/3515925.html
Copyright © 2011-2022 走看看