八皇后C++版本

emmmm~刚刚学C++,写一个八皇后,凑合看吧嘤嘤嘤

 1 #include <iostream>
 2 #include<cstdlib>
 3 #include<cmath>
 4 
 5 using namespace std;
 6 int main()
 7 {
 8     int sz = 8;
 9     int que[sz] = {0};
10     int i = 0;
11     while(i >= 0)
12     {
13         int k = 0;
14         while(k < i)
15         {
16             if(que[k] != que[i] && (abs(que[i] - que[k]) != abs(i - k)))
17                 ++k;
18             else
19                 break;
20         }
21         
22         if(k < i)//出现冲突
23         {
24             ++que[i];
25             
26             while(que[i] == sz)
27             {
28                 que[i] = 0;
29                 --i;
30                 
31                 if(i < 0)
32                     break;
33                 ++que[i];
34             }
35             continue;
36         }
37         
38         else
39         {
40             ++i;
41             if(i < sz)
42                 continue;
43             
44             cout << "找到一个方案";
45             for(k = 0;k < sz;++k)
46                 cout << que[k];
47             cout << endl;
48             
49             if(que[0] < sz-1)
50             {
51                 ++que[0];
52                 continue;
53             }
54             else
55                 break;
56         }
57     }
58 
59     return 0;
60 }

其实还是挺好明白的一个算法,叫——回溯法;

重点就在于:好多break和continue啥的跳来跳去——continue注意他的跳跃范围比较广

拿52行的continue说事:你感觉他会跳哪去?

答案就是11行(超远跳跃,你值得拥有)

 

 

 

 

 

————————————————————————————————————————————————————————————————————

 

第二波更新

 

详情请去做洛谷里面的八皇后

 

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstdio>
 5 using namespace std;
 6 int a[100],b[100],c[100],d[100];
 7 int total,n;
 8 
 9 void print()
10 {
11     if(total <= 2)
12     {
13         for(int k = 1;k <= n;k++)
14             cout << a[k] << " ";
15         
16         cout << endl;
17     }
18     total++;
19 }
20 
21 void queen(int i)
22 {
23     if(i > n)
24     {
25         print();
26         return;
27     }
28     
29     else
30     {
31         for(int j = 1;j <= n;j++)
32         {
33             if((!b[j]) && (!c[i + j]) && (!d[i - j + n]))
34             {
35                 a[i] = j;
36                 b[j] = 1;
37                 c[i + j] = 1;
38                 d[i - j + n] = 1;
39                 
40                 queen(i + 1);
41                 b[j] = 0;
42                 c[i + j] = 0;
43                 d[i - j + n] = 0;
44             }
45         }
46     }
47 }
48 
49 int main()
50 {
51     cin >> n;
52     queen(1);
53     cout << total;
54     return 0;
55 }

 

这次更新的重点在于:queen()函数里面的return的作用

现阶段我能说的就是:return—>结束该层函数的运行返回递归调用函数的上层

举个例子:现在执行的是queen(7),但是发现所执行的方案无法满足要求,那就返回上一层也就是queen(6),更改相应的值,同时清除脏数据

 

posted @ 2019-07-05 14:10  samshui  阅读(244)  评论(0编辑  收藏  举报