zoukankan      html  css  js  c++  java
  • 【Acm】八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。

    其解决办法和我以前发过的【算法之美—Fire Netwww.cnblogs.com/lcw/p/3159414.html】类似

    题目:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

      1 #include <stdio.h>
      2 
      3 int count = 0;    //全局变量,统计所有解法
      4 
      5 int notDanger( int row, int j, int (*chess)[8] )    //判断是否存在危险
      6 {
      7     int i, k, flag1=0, flag2=0, flag3=0, flag4=0, flag5=0;
      8 
      9     // 判断列方向
     10     for( i=0; i < 8; i++ )
     11     {
     12         if( *(*(chess+i)+j) != 0 )
     13         {
     14             flag1 = 1;
     15             break;
     16         }
     17     }
     18 
     19     // 判断左上方
     20     for( i=row, k=j; i>=0 && k>=0; i--, k-- )
     21     {
     22         if( *(*(chess+i)+k) != 0 )
     23         {
     24             flag2 = 1;
     25             break;
     26         }
     27     }
     28 
     29     // 判断右下方
     30     for( i=row, k=j; i<8 && k<8; i++, k++ )
     31     {
     32         if( *(*(chess+i)+k) != 0 )
     33         {
     34             flag3 = 1;
     35             break;
     36         }
     37     }
     38 
     39     // 判断左下方
     40     for( i=row, k=j; i>=0 && k<8; i--, k++ )
     41     {
     42         if( *(*(chess+i)+k) != 0 )
     43         {
     44             flag4 = 1;
     45             break;
     46         }
     47     }
     48 
     49     // 判断右上方
     50     for( i=row, k=j; i<8 && k>=0; i++, k-- )
     51     {
     52         if( *(*(chess+i)+k) != 0 )
     53         {
     54             flag5 = 1;
     55             break;
     56         }
     57     }
     58 
     59     if( flag1 || flag2 || flag3 || flag4 || flag5 )
     60     {
     61         return 0;
     62     }
     63     else
     64     {
     65         return 1;
     66     }
     67 }
     68 
     69 // 参数 row:表示起始行
     70 // 参数 n:表示列数
     71 // 参数 (*chess)[8]: 表示指向棋盘每一行的指针
     72 void EightQueen( int row, int n, int (*chess)[8] )
     73 {
     74     int chess2[8][8], i, j;
     75 
     76     for( i=0; i < 8; i++ )
     77     {
     78         for( j=0; j < 8; j++ )
     79         {
     80             chess2[i][j] = chess[i][j];
     81         }
     82     }
     83 
     84     if( 8 == row )    //本次解法完毕
     85     {
     86         printf("第 %d 种 
    ", count+1);
     87         for( i=0; i < 8; i++ )
     88         {
     89             for( j=0; j < 8; j++ )
     90             {
     91                 printf("%d ", *(*(chess2+i)+j));
     92             }
     93             printf("
    ");
     94         }
     95         printf("
    ");
     96         count++;
     97     }
     98     else
     99     {
    100         for( j=0; j < n; j++ )
    101         {
    102             if( notDanger( row, j, chess ) ) // 判断这个位置是否存在危险
    103             {
    104                 for( i=0; i < 8; i++ )
    105                 {
    106                     *(*(chess2+row)+i) = 0;
    107                 }
    108                 
    109                 *(*(chess2+row)+j) = 1;
    110 
    111                 EightQueen( row+1, n, chess2 );    //没有危险,继续往下
    112             }
    113         }
    114     }
    115 }
    116 
    117 int main()
    118 {
    119     freopen( "output.txt", "w", stdout );    //将输出结果保存到 output.txt中
    120 
    121     int chess[8][8], i, j;
    122 
    123     for( i=0; i < 8; i++ )
    124     {
    125         for( j=0; j < 8; j++ )
    126         {
    127             chess[i][j] = 0;
    128         }
    129     }
    130 
    131     EightQueen( 0, 8, chess );
    132 
    133 
    134     printf("总共有 %d 种解决方法 
    
    ", count);
    135 
    136     fclose(stdout);
    137     return 0;
    138 }
    View Code
  • 相关阅读:
    2018-2019-2 20189203 移动平台应用开发实践第六周学习总结
    安全类会议级别
    信息安全工程实践WEEK5,开发WEEK2
    信息安全工程实践WEEK5,开发WEEK1
    如何在Word中排出漂亮的代码
    2018-2019-1 20189204《Linux内核原理与分析》第九周作业
    2018-2019-1 20189204《Linux内核原理与分析》第八周作业
    2018-2019-1 20189204《Linux内核原理与分析》第七周作业
    2018-2019-1 20189204《Linux内核原理与分析》第六周作业
    2018-2019-1 20189204《Linux内核原理与分析》第五周作业
  • 原文地址:https://www.cnblogs.com/lcw/p/3162392.html
Copyright © 2011-2022 走看看