麻烦各位大哥大姐看看小弟得第一次
下面是小弟我第一次完整写的程序(皇后问题),编译说我的二维数组定义错误!!给位帮我看看行吗?
***************************************************************************
#include<stdio.h>
main()
{
int N;
int i,j,m,n,h;
//输入棋盘的边数
printf("input the length of the board:");
scanf("%D",&N);
h=N*N;
int p[N][N];
//初始化棋盘界面,全部设为2
for(i=0;i<=N;i++)
{for(j=0;j<=N;j++)
p[i][j]=2;
}
//玩家输入第一个皇后的位置
printf("input the row in which you want to put the first queen:");
i=getchar();
if(i>=N||i<0)
printf("the unavailible row");
printf("input the volum in which you want to put the first queen:");
j=getchar();
if(j>=N||j<0)
printf("the unavailible volum");
p[i][j]=0;//用0代表皇后
//用下面的循环填其他的皇后
loop:while(h!=0)
{
//找出与皇后同行同列同斜线的格子填上一
for(m=0;m<=N;m++)
{for(n=0;n<=N;n++)
{if(m==i||n==j||m-i==m-j)
p[m][n]=1;
}
}
for(m=0;m<=N;m++)
{for(n=0;n<=N;n++)
{if(m!=i&&n!=j&&m-i!=m-j&&p[m][n]=2)
{
p[m][n]=0;//在剩下的格子里找出第一个值为2的格子,并赋值为0(又一个皇后)
i=m;
j=n;
goto loop;
}
}
}
for(m=0;m<=N;m++)
{for(n=0;n<=N;n++)
{if(p[m][n]!=2)
h--;
}
}
}
//打印输出结果
for(m=0;m<=N;m++)
{for(n=0;n<=N;n++)
printf("%d ",p[m][n]);
printf("\n ");
}
}
************************************************
问题点数:100、回复次数:12Top
1 楼ma100()回复于 2004-09-03 00:42:43 得分 10
int p[N][N];N不能动态定义,C语言的书将的很详细了Top
2 楼zhangfjj(小张)回复于 2004-09-03 00:47:37 得分 10
如果仅是二维数组动态定义有问题,其他算法没有问题,坛子里有许多关于使用malloc()来动态申请内存定义动态数组的贴子
http://community.csdn.net/Expert/topic/3045/3045196.xml?temp=.4560511Top
3 楼zhangfjj(小张)回复于 2004-09-03 00:50:02 得分 0
兄弟,不要随便说什么我的第一次,好吓人哟!
@_@Top
4 楼ma100()回复于 2004-09-03 01:00:42 得分 20
参照 小张的帖子,给出申请和释放程序
////////////////////int p[N][N];
//动态二维数组,如果用指针的话,先生成一个一维的指针数组,长度为二维数组的行数,
//再动态的生成若干个(等于行数)一维数组(长度为列数),使得指针数组的每个元素指向这些//数组就行了。
//申请
int **p;
p=(int **)malloc(sizeof(int *)*N);
if(p==NULL)
{
printf("rows error!\n");
return 0;
}
for(i=0;i<N;i++)
{
p[i]=(int *)malloc(sizeof(int)*N);
if(p[i]==NULL)
{
printf("cols errors!\n");
return 0;
}
}
//释放:for(i=0;i<N;i++)
free(p[i]);
free(p);
//---------语法错误:
//初始化棋盘界面,全部设为2
for(i=0;i<N;i++)//是 <N 不是<=N
{
for(j=0;j<N;j++)
p[i][j]=2;
}
if(m!=i&&n!=j&&m-i!=m-j&&p[m][n]==2) 是==2
另外强烈建议去掉gotoTop
5 楼sysmanager(坦桔)回复于 2004-09-03 08:28:30 得分 0
我看了你的的第一次.有分给吗?Top
6 楼liushuweixing(AA22)回复于 2004-09-03 08:50:33 得分 10
int N;就是错的,静态数组,应该#define N 4动态应该mallocTop
7 楼yjh1982(血精灵)回复于 2004-09-03 08:55:59 得分 0
这种第一次?失望....Top
8 楼improgrammer(无忌)回复于 2004-09-03 09:02:13 得分 30
建议:
1 既然第一次,不要考虑太多的“灵活性”,棋盘作成固定8*8的,先把后面的算法搞对再说。搞软件有个从简原则,很重要的。
2 建议所有运行时的交互式输入改用命令行参数。我建议初学者不要听从教科书的误导,一开始就面临一大堆传统交互式输入函数。小程序、命令行工具型程序用参数更好。
3 输入值检查存在漏洞:既然已经发现是非法值,应该退出,return -1 或 exit(-1) 都可以。
4 如果算法本身没错的话,这里的goto 用法还是可以接受的。但把loop:写到循环体最后一句更整齐(运行效果是一样的)。
5 把循环体写成一个独立函数,以h为参数(N为全局常数),就可以很舒服地取消goto了。再把整个while()循环和前面的初始化语句写成一个独立函数,就更清晰了。可以舒服地编写测试程序。
Top
9 楼improgrammer(无忌)回复于 2004-09-03 09:04:25 得分 10
把IO部分和算法部分分开,也是写程序的一个原则。清晰地分解、隔离。Top
10 楼jade_c(珏)回复于 2004-09-03 09:06:05 得分 10
支持ma100()
建议去掉gotoTop
11 楼Lonelywolf1899(プログラマ)回复于 2004-09-03 09:09:03 得分 0
int N;就是错的,静态数组,应该#define N 4动态应该malloc
-------------------------------------------------------
严重同意此观点!Top
12 楼huangshengcsdn(黄盛)回复于 2004-09-03 11:38:02 得分 0
其实还是有很多不明白,不过我慢慢消化啦!!!谢谢各位Top




