今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题。
看这篇随笔前,最好先看看我上一篇所写的 c++ 内存分配中一个有趣的小问题。
先看代码
1 #pragma once 2 #pragma execution_character_set("utf-8") 3 #include <iostream> 4 #include <cstdio> 5 using std::cout; 6 using std::endl; 7 8 const int COLUMNS = 8; 9 const int ROWS = 8; 10 int Matrix[COLUMNS][ROWS] = { 0 }; 11 12 void print() 13 { 14 for (int row = 0; row < ROWS; ++row) 15 { 16 for (int col = 0; col < COLUMNS; ++col) 17 { 18 cout << Matrix[row][col] << " "; 19 } 20 cout << endl; 21 } 22 cout << endl; 23 } 24 25 bool check(int row, int col) 26 { 27 //检查列 28 for (int r = 0; r < row; ++r) 29 { 30 if (Matrix[r][col]) 31 return false; 32 } 33 for (int r = row - 1, c = col - 1; r != -1 && c != -1; --r, --c) 34 { 35 if (Matrix[r][c]) 36 return false; 37 } 38 for (int r = row - 1, c = col + 1; r != -1 && c != COLUMNS; --r, ++c) 39 { 40 if (Matrix[r][c]) 41 return false; 42 } 43 return true; 44 } 45 46 47 void writeQueen(int currentRow) 48 { 49 static int count = 0; 50 if (currentRow == ROWS) 51 { 52 ++count; 53 cout << count << endl; 54 print(); 55 //return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。 56 } 57 58 int col = 0; 59 for (; col < COLUMNS; ++col) 60 { 61 Matrix[currentRow][col] = 1; 62 //print(); 63 if (check(currentRow, col)) 64 writeQueen(currentRow + 1); 65 Matrix[currentRow][col] = 0; 66 } 67 } 68 69 int main() 70 { 71 writeQueen(0); 72 }
运行出来后结果是这样的:
即每个结果的序号都是1,明显不符合我的意图。
之后就是寻找错误原因了,定位到这一段代码上:
1 void writeQueen(int currentRow) 2 { 3 static int count = 0; 4 if (currentRow == ROWS) 5 { 6 ++count; 7 cout << count << endl; 8 print(); 9 //return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。 10 } 11 12 int col = 0; 13 for (; col < COLUMNS; ++col) 14 { 15 Matrix[currentRow][col] = 1; 16 //print(); 17 if (check(currentRow, col)) 18 writeQueen(currentRow + 1); 19 Matrix[currentRow][col] = 0; 20 } 21 }
打断点进行调试。
发现当执行Matrix[currentRow][col] = 0;这一句代码后count的值由1变为了0。
为什么会这样呢?我看了一下地址:
他两的地址居然是同一个!
为什么会出现这种情况?
count和Matrix都定义在全局区,Matrix的初始化语句为Matrix[8][8],原本Matrix所控制的内存空间与count的并不冲突,可是我访问Matrix时却越界了,我访问的是Matrix[8][0],而系统在分配内存时却恰好将count分配到了Matrix之后,这两变量的缘分太深了,没办法。。。由此造成了内存污染,当修改Matrix时无意中也造成了count被修改。
所以,归根结底还是访问越界了!
原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11779073.html
时间: 2024-10-31 08:05:10