有段代码,调试后的结果怎么都理解不了!求解惑

ImAmelie 2014-07-22 11:54:33
这是自己写8皇后问题代码
调试的时候有一段操作的返回值怎么都理解不了
问题我用注释的形式说明了!

#include <stdio.h>
#define block(a,b,c) change(a,b,2,c)
#define unblock(xy) rechange(xy)
typedef struct
{
int i;
int j;
}XY;
void queen(int, int);
void change(int m, int n, int num, XY *p);
void rechange(XY *p);
int matrix[8][8] = { 0 };
int num = 0;
int main()
{
queen(8, 0);
return 0;
}
void queen(int n,int i)
{
if (n == 0)
{
num++;
printf("第%d种解法\n", num);
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
if (matrix[i][j] == 0 || matrix[i][j] == 2)
putchar(' ');
else
putchar('*');
}
putchar('\n');
}
return;
}
for (int j = 0; j != 8; j++)
{
if (matrix[i][j] == 0)
{
XY xy[13] = { 0 };
matrix[i][j] = 1;//在这里设置断点1
printf("%d\n%d\n", n, i);//n=8 i=0
block(i, j, xy);//执行完此语句n和i的值会变化????
//宏展开change(i,j,2,xy);
printf("%d\n%d\n", n, i);//n=6 i=7 问题出在这里,change函数是怎么改变n和i的值的?
queen(n - 1, i + 1);//在这里设置断点2
matrix[i][j] = 0;
unblock(xy);
}
}
}
void change(int m, int n, int num,XY *p)
{
int i, j;
//上
for (i = m - 1, j = n; i != -1; i--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//下
for (i = m + 1, j = n; i != 8; i++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//左
for (i = m, j = n - 1; j != -1; j--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//右
for (i = m, j = n + 1; j != 8; j++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//左上
for (i = m - 1, j = n - 1; i != -1 && j != -1; i--, j--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//左下
for (i = m + 1, j = n - 1; i != 8 && j != -1; i++, j--)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//右上
for (i = m - 1, j = n + 1; i != -1 && j != 8; i--, j++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
//右下
for (i = m + 1, j = n + 1; i != 8 && j != 8; i++, j++)
{
if (matrix[i][j] == 2)
break;
matrix[i][j] = num;
p->i = i;
p->j = j;
p++;
}
p->i = -1;
p->j = -1;
}
void rechange(XY *p)
{
for (; p->i != -1; p++)
matrix[p->i][p->j] = 0;
}
...全文
246 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_18258203 2014-07-23
  • 打赏
  • 举报
回复
p溢出鸟..
赵4老师 2014-07-23
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
int d[8][8];
int n;
void queen8(int L) {
    int x,y;

    if (8==L) {
        n++;
        printf("%d\n",n);
        for (y=0;y<8;y++) {
            for (x=0;x<8;x++) {
//              printf("%d",d[y][x]);
                if (d[y][x]) printf("■");
                else         printf("□");
            }
            printf("\n");
        }
        return;
    }
    for (x=0;x<8;x++) {
        for (y=0;y<L;y++) {
            if  (              d[y][x      ]
             || (x-(L-y)>=0 && d[y][x-(L-y)])
             || (x+(L-y)< 8 && d[y][x+(L-y)]))
                break;
        }
        if (y>=L) {
            d[L][x]=1;
            queen8(L+1);
            d[L][x]=0;
        }
    }
}
int main() {
    int y,x;
    for (y=0;y<8;y++) {
        for (x=0;x<8;x++) {
            d[y][x]=0;
        }
    }
    queen8(0);
    return 0;
}
赵4老师 2014-07-23
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
ImAmelie 2014-07-23
  • 打赏
  • 举报
回复
给你发私信了,请查收!
引用 2 楼 zhao4zhong1 的回复:

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧