今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题。
看这篇随笔前,最好先看看我上一篇所写的 c++ 内存分配中一个有趣的小问题。
先看代码
#pragma once
#pragma execution_character_set("utf-8")
#include <iostream>
#include <cstdio>
using std::cout;
using std::endl; const int COLUMNS = ;
const int ROWS = ;
int Matrix[COLUMNS][ROWS] = { }; void print()
{
for (int row = ; row < ROWS; ++row)
{
for (int col = ; col < COLUMNS; ++col)
{
cout << Matrix[row][col] << " ";
}
cout << endl;
}
cout << endl;
} bool check(int row, int col)
{
//检查列
for (int r = ; r < row; ++r)
{
if (Matrix[r][col])
return false;
}
for (int r = row - , c = col - ; r != - && c != -; --r, --c)
{
if (Matrix[r][c])
return false;
}
for (int r = row - , c = col + ; r != - && c != COLUMNS; --r, ++c)
{
if (Matrix[r][c])
return false;
}
return true;
} void writeQueen(int currentRow)
{
static int count = ;
if (currentRow == ROWS)
{
++count;
cout << count << endl;
print();
//return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
} int col = ;
for (; col < COLUMNS; ++col)
{
Matrix[currentRow][col] = ;
//print();
if (check(currentRow, col))
writeQueen(currentRow + );
Matrix[currentRow][col] = ;
}
} int main()
{
writeQueen();
}
运行出来后结果是这样的:
即每个结果的序号都是1,明显不符合我的意图。
之后就是寻找错误原因了,定位到这一段代码上:
void writeQueen(int currentRow)
{
static int count = ;
if (currentRow == ROWS)
{
++count;
cout << count << endl;
print();
//return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
} int col = ;
for (; col < COLUMNS; ++col)
{
Matrix[currentRow][col] = ;
//print();
if (check(currentRow, col))
writeQueen(currentRow + );
Matrix[currentRow][col] = ;
}
}
打断点进行调试。
发现当执行Matrix[currentRow][col] = 0;这一句代码后count的值由1变为了0。
为什么会这样呢?我看了一下地址:
他两的地址居然是同一个!
为什么会出现这种情况?
count和Matrix都定义在全局区,Matrix的初始化语句为Matrix[8][8],原本Matrix所控制的内存空间与count的并不冲突,可是我访问Matrix时却越界了,我访问的是Matrix[8][0],而系统在分配内存时却恰好将count分配到了Matrix之后,这两变量的缘分太深了,没办法。。。由此造成了内存污染,当修改Matrix时无意中也造成了count被修改。
所以,归根结底还是访问越界了!