zoukankan      html  css  js  c++  java
  • dfs:马踏棋盘

      1 #include<stdio.h>
      2 #include<time.h>
      3 
      4 #define X 8
      5 #define Y 8
      6 
      7 int chess[X][Y];
      8 
      9 //查找当前位置的下一个位置
     10 int nextxy(int* x, int* y, int count)
     11 {
     12     switch (count)
     13     {
     14     case 0:
     15         if (*x + 2 <= X - 1 && *y - 1 >= 0 && chess[*x + 2][*y - 1] == 0)
     16         {
     17             *x += 2;
     18             *y -= 1;
     19             return 1;
     20         }
     21         break;
     22 
     23     case 1:
     24         if (*x + 2 <= X - 1 && *y + 1 <= Y - 1 && chess[*x + 2][*y + 1] == 0)
     25         {
     26             *x += 2;
     27             *y += 1;
     28             return 1;
     29         }
     30         break;
     31 
     32     case 2:
     33         if (*x + 1 <= X - 1 && *y + 2 <= Y - 1 && chess[*x + 1][*y + 2] == 0)
     34         {
     35             *x += 1;
     36             *y += 2;
     37             return 1;
     38         }
     39         break;
     40 
     41     case 3:
     42         if (*x - 1 >= 0 && *y + 2 <= Y - 1 && chess[*x - 1][*y + 2] == 0)
     43         {
     44             *x -= 1;
     45             *y += 2;
     46             return 1;
     47         }
     48         break;
     49         
     50     case 4:
     51         if (*x - 2 >= 0 && *y + 1 <= Y - 1 && chess[*x - 2][*y + 1] == 0)
     52         {
     53             *x -= 2;
     54             *y += 1;
     55             return 1;
     56         }
     57         break;
     58 
     59     case 5:
     60         if (*x - 2 >= 0 && *y - 1 >= 0 && chess[*x - 2][*y - 1] == 0)
     61         {
     62             *x -= 2;
     63             *y -= 1;
     64             return 1;
     65         }
     66         break;
     67         
     68     case 6:
     69         if (*x - 1 >= 0 && *y - 2 >= 0 && chess[*x - 1][*y - 2] == 0)
     70         {
     71             *x -= 1;
     72             *y -= 2;
     73             return 1;
     74         }
     75         break;
     76 
     77     case 7:
     78         if (*x + 1 <= X - 1 && *y - 2 >= 0 && chess[*x + 1][*y - 2] == 0)
     79         {
     80             *x += 1;
     81             *y -= 2;
     82             return 1;
     83         }
     84         break;
     85     default:
     86         break;
     87     }
     88 
     89     return 0;
     90 }
     91 
     92 void print()
     93 {
     94     int i, j;
     95     for (i = 0; i < X; i++)
     96     {
     97         for (j = 0; j < Y; j++)
     98         {
     99             printf("%2d	", chess[i][j]);
    100         }
    101         printf("
    ");
    102     }
    103 
    104     printf("
    ");
    105 }
    106 
    107 //深度优先遍历
    108 //(x,y)为位置坐标
    109 //tag为标记变量,每走一步,tag+1
    110 int TravelChessBoard(int x, int y, int tag)
    111 {
    112     int x1 = x;
    113     int y1 = y;
    114     int flag = 0;
    115     int count = 1;
    116     chess[x][y] = tag;
    117 
    118     if (tag == X * Y)
    119     {
    120         //打印棋盘
    121         print();
    122         return 1;
    123     }
    124     //找到马的下一个可走坐标(x1,y1),如果找到flag = 1,否则为0
    125     flag = nextxy(&x1, &y1, count);
    126     while (flag == 0 && count < 8)
    127     {
    128         count++;
    129         flag = nextxy(&x1, &y1, count);
    130     }
    131 
    132 
    133     while (flag)
    134     {
    135         if (TravelChessBoard(x1, y1, tag + 1))
    136         {
    137             return 1;
    138         }
    139 
    140         //继续找到马的下一步的可走的坐标(x1,y1),如果找到flag = 1,否则为0
    141         x1 = x;
    142         y1 = y;
    143         count++;
    144 
    145         flag = nextxy(&x1, &y1, count);
    146         while (flag == 0 && count < 8)
    147         {
    148             count++;
    149             flag = nextxy(&x1, &y1, count);
    150         }
    151     }
    152 
    153     if (flag == 0)
    154     {
    155         chess[x][y] = 0;
    156     }
    157 
    158     return 0;
    159 }
    160 
    161 int main()
    162 {
    163     int i, j;
    164     clock_t start, finish;
    165 
    166     start = clock();
    167 
    168     for (i = 0; i < X; i++)
    169     {
    170         for (j = 0; j < Y; j++)
    171         {
    172             chess[i][j] = 0;
    173         }
    174     }
    175 
    176     printf("下面开始马踏棋盘:
    ");
    177     if (!TravelChessBoard(1, 0, 1))
    178     {
    179         printf("马踏棋盘失败了
    ");
    180     }
    181 
    182     finish = clock();
    183     printf("
    本次计算义工耗时:%f
    
    ", (double)(finish - start) / CLOCKS_PER_SEC);
    184 
    185     return 0;
    186 }

    程序没问题,但是再vs上运行了好久也没运行出来

  • 相关阅读:
    MySQL 分库分表方案
    MySQL高性能优化实战总结
    MySQL太慢?试试这些诊断思路和工具
    Get MySQL这5个优化技巧
    一次MySQL两千万数据大表的优化过程,三种解决方案
    MySQL 常用30种SQL查询语句优化方法
    掌握 MySQL 这 19 个骚操作,效率至少提高3倍
    分分钟解决 MySQL 查询速度慢与性能差
    总结 | 慢 SQL 问题经验总结
    MySQL主从延时这么长,要怎么优化?
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12727091.html
Copyright © 2011-2022 走看看