VS2017C语言编程,写入位置时发生访问冲突

fzjlovehh 2018-06-20 10:40:42
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

long long int mov(int);
//参数1:第j个位置
long long int count;
int coordinate1[13] = { 0 };
//横坐标
int coordinate2[13] = { 0 };
//纵坐标
int j = 0;
int m = 0;

int main(void)
{
count = 0;
//初始坐标为(0,0)
count = mov(j);
printf("%lld\n", count);
system("pause");
return 0;
}

long long int mov(int j)
{
if (j == 13)
return 1;
int new_pos1, new_pos2;
int i;
for (i = 1; i < 5; i++)
{
switch (i)
{
case 1:
{
//前进:横坐标不变,纵坐标加1
new_pos2 = coordinate2[j] + 1;
new_pos1 = coordinate1[j];
break;
}
case 2:
{
//后退:横坐标不变,纵坐标减1
new_pos2 = coordinate2[j] - 1;
new_pos1 = coordinate1[j];
break;
}
case 3:
{
//左移:横坐标加1,纵坐标不变
new_pos1 = coordinate1[j] + 1;
new_pos2 = coordinate2[j];
break;
}
case 4:
{
//右移:横坐标减1,纵坐标不变
new_pos1 = coordinate1[j] - 1;
new_pos2 = coordinate2[j];
break;
}
default:
break;
}
int k;
for (k = j; k >= 0; k--)
{
if (new_pos1 == coordinate1[k] && new_pos2 == coordinate2[k])
{
break;
}
else
{
coordinate1[j+1] = new_pos1;
coordinate2[j+1] = new_pos2;
}
}
if (k >= 0)
{
continue;
}
j++;
m = j;
count = count + mov(m);
}
return count;
}
想根据《程序员的算法趣题》中Q08优秀的扫地机器人的原ruby代码改写C语言程序,结果出现错误。
机器人从原点出发,上下左右移动,移动12次,经过的坐标点不重复,有多少种路径。
望各位能够解答小弟程序的问题。
...全文
1074 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzjlovehh 2018-06-20
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
  //if (j == 13)
    if (j >= 13)
        return 1;
这个条件改一下,把j == 13改成j >= 13;否则,你会发现j的值会大于13,最终会导致
nt coordinate1[13] = { 0 };
//横坐标
int coordinate2[13] = { 0 };
//纵坐标
数组越界,导致内存溢出而程序异常退出。 可以试一下,不改成j >= 13;在mov函数里加一句打印j的值。
printf("j = %d\n", j);
看看是不是j的值大于13了,我测试的结果是j= 967,然后程序异常退出(段错误)
回复一下2楼的前辈,包含原点在内,移动12步,数组的长度是13,因为之前使用matlab,角标是1~13,但是C应该是0~12,所以经过你的提示那部分代码应该改为,
  //if (j == 13)
    if (j >11)
        return 1;
j>11,j的最小值是12,coordinate[12]就是第13个单元,不需要也不能产生第14个坐标,所以我认为应该这么修改。 将j==13改为j>11之后,的确解决了出现的问题,但是结果仍然不对。需要继续修改。
赵4老师 2018-06-20
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?
Imlym 2018-06-20
  • 打赏
  • 举报
回复
程序里用到了j+1, 所以判断要改成 if (j>=12)
自信男孩 2018-06-20
  • 打赏
  • 举报
回复
  //if (j == 13)
    if (j >= 13)
        return 1;
这个条件改一下,把j == 13改成j >= 13;否则,你会发现j的值会大于13,最终会导致
nt coordinate1[13] = { 0 };
//横坐标
int coordinate2[13] = { 0 };
//纵坐标
数组越界,导致内存溢出而程序异常退出。 可以试一下,不改成j >= 13;在mov函数里加一句打印j的值。
printf("j = %d\n", j);
看看是不是j的值大于13了,我测试的结果是j= 967,然后程序异常退出(段错误)
fzjlovehh 2018-06-20
  • 打赏
  • 举报
回复
我用单步执行,每一步之后的变量值的确符合我的预期。
C语言是一门广泛应用于系统编程、嵌入式软件和高性能应用开发的高级编程语言。本课程旨在向你介绍C语言的基本概念、语法和编程技巧,使你能够掌握C语言的核心知识,并能够用C语言编写简单到中等复杂程度的程序。课程针对0基础初学者,所以课程会由浅入深,由表及里的探索C语言知识框架,慢慢触及C语言本质,课程结构先由简单程序引入,然后拆分程序各个细节,让你逐渐掌握C语言编程的精髓。也会讲解C语言编译过程,怎样将人类描述的语言让计算机能够识别并按我们的意愿运行。C语言程序怎样运行也会详细介绍,了解程序由静到动的过程。课程注重基础理论与实践结合,在重点关注C语言的基础理论知识的同,我们会结合大量的实际编程练习,对每个重要的知识点和易错的地方都有代码演示并查看程序运行结果,深入理解C语言的运作原理。课程中一半内容是理论知识的讲解,另外一半是代码实操。课程由本人全部从0开始编写,从课程架构思考,内容组织,难易程度,章节划分,都融入了本人对C语言的思考,几乎全是干货,如果你渴望成为一名优秀的C语言编程者,那么不要犹豫!欢迎报名参加我们的课程,让我们一起踏上编程的旅程,共同学习和进步!课程源码:https://gitee.com/sliaowalker/c-language-programming

69,371

社区成员

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

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