哇~我现在才写八皇后,我菜死了

it2025-04-02  9

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),更改相应的值,同时清除脏数据

 

转载于:https://www.cnblogs.com/yhm-ihome/p/11138000.html

最新回复(0)