大家帮忙看看c语言程序,最好写上每行注释

#include<stdio.h>
#include<time.h>
#define MAX 32
long queen[MAX]={0},queenl = 1;
int count =0,label = 0;
FILE *txt;

void Answers(long row, long ml, long mr)
{
if(row != queenl)
{
long pos = queenl & ~(row|ml|mr);
while(pos)
{
long p = pos & -pos;
pos-=p;
Answers(row|p, (ml|p)>>1, (mr|p)<<1);
}
}
else
count++;
}

void Answersp(int n,long row, long ml, long mr)
{
if(row != queenl)
{
long pos = queenl & ~(row|ml|mr);
while(pos)
{
long p = pos & -pos;
pos-=p;
int i = 0;
while(p>>i)i++;
queen[n] = i;
Answersp(n+1, row|p, (ml|p)>>1, (mr|p)<<1);
queen[n] = 0;
}
}
else
{
count++;
for(int j=0; j<label; j++)
fprintf(txt,"%d.",queen[j]);
fprintf(txt," ");
if(count%3 == 0)fprintf(txt,"\n");
}
}

int main()
{
double f,f1;
char print= 'n' ,flag;
printf("请输入1~32的之间的整数:");
while(label == 0 || label <= 1 || label >= 32)
{
scanf("%d",&label);
while((flag = getchar()) != 10);
if(label <= 0 || label <= 1 || label >= 32)
printf("非法输入!\n请输入1~31的之间的整数:\n");
}
printf("将%d皇后的解输出到answer.txt?(Y确定,任意键继续)\n",label);
scanf("%c",&flag);
print = flag;
while(flag != 10)flag = getchar();
printf("程序计算中,所需时间依问题规模而定,请耐心等待....\n");

for(int i=1; i<label; i++)
queenl=1+(queenl<<1);
if(print == 'y' || print == 'Y')
{
if((txt=fopen("answer.txt","w"))==NULL)
printf("answer.txt文件打开出错!\n");
else
{
f=time(NULL);
Answersp(0, 0, 0, 0);
f1=time(NULL);
f1 = f1-f;
fprintf(txt,"\n==%d问题的解总数有%d种==\n",label,count);
fprintf(txt,"用时%d分%d秒\n",(int)(f1/60),(int)((int)f1%60));
fclose(txt);
}
}
else
{
f=time(NULL);
Answers(0, 0, 0);
f1=time(NULL);
f1 = f1-f;
printf("\n==%d问题的解总数有%d种==\n",label,count);
printf("用时%d分%d秒\n",(int)(f1/60),(int)((int)f1%60));
}
printf("Program end.\nPress Enter key to exit!");
while((flag = getchar()) != 10);
}
是希望大家能够帮我看懂算法,教教我
2楼的回复是没用的,我要的是算法的解释,不是一句话的解释,而且二楼还犯了错误,把逻辑联系词和位运算搞混了

#include<stdio.h>// 系统函数
#include<time.h>//时间函数
#define MAX 32 //定义函数MAX=32
long queen[MAX]={0},queenl = 1; // 长数组queen MAX内元素为全零,queenl 这个函数为1
int count =0,label = 0;//整形 函数 定义数值
FILE *txt; 文件格式
void Answers(long row, long ml, long mr)
无返回值函数(long是一种数字的格式,有long short double float)
{
if(row != queenl)//条件
{
long pos = queenl & ~(row|ml|mr);同时满足两个条件下 pos等于这个结果
while(pos)//循环
{
long p = pos & -pos;// p等于同时正负pos,也就是说,怎么说好呢,你就理解为它是一个无法满足的条件,使之变成0,因为只有0是+-一体的
pos-=p; // pos=pos -p
Answers(row|p, (ml|p)>>1, (mr|p)<<1);
}
}
else
count++; count= count +1
}

void Answersp(int n,long row, long ml, long mr)//同理
{
if(row != queenl)
{
long pos = queenl & ~(row|ml|mr);
while(pos)
{
long p = pos & -pos;
pos-=p;
int i = 0;
while(p>>i)i++; //当满足p>>0时 i=i+1,但是注意这句话有点问题,你少了一对大括号,循环语句没有循环的范围,这样的话循环的只有queen【n】=i这句话
queen[n] = i;
Answersp(n+1, row|p, (ml|p)>>1, (mr|p)<<1);
queen[n] = 0;
}
}
else
{
count++;
for(int j=0; j<label; j++)
fprintf(txt,"%d.",queen[j]);//出指令printf(“ “)是格式
fprintf(txt," ");
if(count%3 == 0)fprintf(txt,"\n");
}
}

int main()main函数,程序主体
{
double f,f1; 定义双精度浮点函数
char print= 'n' ,flag; 字符函数
printf("请输入1~32的之间的整数:"); 输出
while(label == 0 || label <= 1 || label >= 32) 同时满足三个条件执行循环,这个循环,其实就是流文件读取确保里面有东西
{
scanf("%d",&label); 读入
while((flag = getchar()) != 10);
这句循环条件2 steps| 1) flag = grther() 2) flag所获得的值不能等于10
if(label <= 0 || label <= 1 || label >= 32)
printf("非法输入!\n请输入1~31的之间的整数:\n");
}
printf("将%d皇后的解输出到answer.txt?(Y确定,任意键继续)\n",label);
scanf("%c",&flag);
print = flag;
while(flag != 10)flag = getchar();
printf("程序计算中,所需时间依问题规模而定,请耐心等待....\n");

for(int i=1; i<label; i++) 循环
queenl=1+(queenl<<1);
if(print == 'y' || print == 'Y')
{
if((txt=fopen("answer.txt","w"))==NULL) fopen是流文件读取
printf("answer.txt文件打开出错!\n");
else
{
f=time(NULL); null是系统函数,似乎是空值,这个记不清了,很多年没编辑C了,忘了
Answersp(0, 0, 0, 0);
f1=time(NULL);
f1 = f1-f;
fprintf(txt,"\n==%d问题的解总数有%d种==\n",label,count);
fprintf(txt,"用时%d分%d秒\n",(int)(f1/60),(int)((int)f1%60));
fclose(txt);流文件读取关闭
}
}
else
{
f=time(NULL);
Answers(0, 0, 0);
f1=time(NULL);
f1 = f1-f;
printf("\n==%d问题的解总数有%d种==\n",label,count);
printf("用时%d分%d秒\n",(int)(f1/60),(int)((int)f1%60));
}
printf("Program end.\nPress Enter key to exit!");
while((flag = getchar()) != 10);
}
大概的进行了标注,相同格式的语句就没有重复标记,希望你能理解追问

我是希望您能帮我看懂程序,告诉我算法是怎么一个样子

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-27
#include<stdio.h>
#include<time.h>
#define MAX 32 //数组用以存放N皇后的一个状态(数组下表表示行,元素值表示列)
long queen[MAX]={0},queenl = 1;//queenl 位运算需要的变量,用法以下有说明
int count =0,label = 0; //count计数器,存放解的个数,label存放N皇后的N值
FILE *txt;

void Answers(long row, long ml, long mr)//详细说明,见下面的Answersp()函数
{//递归 位运算 N皇后函数(不带输出)
if(row != queenl)
{
long pos = queenl & ~(row|ml|mr);
while(pos)
{
long p = pos & -pos;
pos-=p;
Answers(row|p, (ml|p)>>1, (mr|p)<<1);
}
}
else
count++;
}

void Answersp(int n,long row, long ml, long mr)//n表示计算的第n行的皇后位置
{//递归 位运算 N皇后函数(带输出) //row,ml,mr分别为上面的所有皇后在该行吃掉的列位,以及左、右对角线位(row,mr,ml均以二进制表示,其中为1的位表示该列被吃掉,为0则表示没被吃掉)
if(row != queenl) //如果N皇后没有全部排好;row(二进制值)中1表示已排皇后,0表示未排
{
long pos = queenl & ~(row|ml|mr); //从queel中扣去已被吃掉的列,pos表示该行可排的位置:1表示可排,0表示不可排
while(pos) //如果该行还有可排的位置则继续循环
{
long p = pos & -pos; //计算出pos中最右边所在的位(用以存放皇后)
pos-=p; //将pos中对应的位改为0,表示该位已经排了皇后
int i = 0;
while(p>>i)i++; //此时第n行的皇后合法状态转换为具体的列坐标
queen[n] = i; //将列坐标存入对应的行
Answersp(n+1, row|p, (ml|p)>>1, (mr|p)<<1); //排下一行的皇后
queen[n] = 0; //将该行原先放皇后的位置清空,以便继续放该行的下一个位置放皇后
}
}
else
{
count++; //累计解得个数
for(int j=0; j<label; j++)
fprintf(txt,"%d.",queen[j]);//将解输出到文件
fprintf(txt," ");
if(count%3 == 0)fprintf(txt,"\n");
}
}

int main()
{//主函数
double f,f1; //保存时间值
char print= 'n' ,flag;
printf("请输入1~32的之间的整数:");
while(label == 0 || label <= 1 || label >= 32)//该循环用以检查N值输入是否合法
{
scanf("%d",&label);
while((flag = getchar()) != 10);
if(label <= 0 || label <= 1 || label >= 32)
printf("非法输入!\n请输入1~31的之间的整数:\n");
}
printf("将%d皇后的解输出到answer.txt?(Y确定,任意键继续)\n",label);
scanf("%c",&flag); //是否打印
print = flag;
while(flag != 10)flag = getchar();
printf("程序计算中,所需时间依问题规模而定,请耐心等待....\n");

for(int i=1; i<label; i++) //将queenl改成二进制表示时前N(label)位是1
queenl=1+(queenl<<1); //位运算,queel左移,并在第一位补上1
if(print == 'y' || print == 'Y')
{
if((txt=fopen("answer.txt","w"))==NULL)//打开文件
printf("answer.txt文件打开出错!\n");
else
{
f=time(NULL); //保存开始时间
Answersp(0, 0, 0, 0); //**核心部分,N皇后问题的求解过程(带打印功能)**//
f1=time(NULL); //保存结束时间
f1 = f1-f; //计算求解过程耗时
fprintf(txt,"\n==%d数码问题的解总数有%d种==\n",label,count);
fprintf(txt,"用时%d分%d秒\n",(int)(f1/60),(int)((int)f1%60));
fclose(txt);
}
}
else
{
f=time(NULL); //保存开始时间
Answers(0, 0, 0); //**核心部分,N皇后问题的求解过程(不带打印功能)**//
f1=time(NULL); //保存结束时间
f1 = f1-f; //计算求解过程耗时
printf("\n==%d数码问题的解总数有%d种==\n",label,count);
printf("用时%d分%d秒\n",(int)(f1/60),(int)((int)f1%60));
}
printf("Program end.\nPress Enter key to exit!");
while((flag = getchar()) != 10);
}本回答被提问者采纳
第2个回答  2011-09-25

必须是300行吗 少一点可以吗追问

您帮我把算法看懂,然后告诉我啊,这是一个n皇后的程序,但是算法我看不懂

第3个回答  2011-09-25
哎,40分真难挣啊。

我用C语言写了个程序 可是运行不了 请大家帮忙看看
salary 为什么要用int,而且scanf后面用lf读入,是一个float,赋给一个int值。switch开关语句后面的case必须是一个确定的整数,表达式是不行的,建议改成if结构。程序出错就在这里。而且即便支持表达式,表达式返回的也是一个boolean类型的值,逻辑是有问题的。修改建议:salary改用double switch语句改成if语...

关于C语言编写程序的一个疑问 高手帮忙看看我的程序哪错了
看了你的代码觉得,你在C语言的语法规则上还有待提高啊,在此举出你所给出的代码的若干错误。首先,你的代码不完整。第9、11、13行要定义三个100行的二维字符数组,如果仅仅是类似char adj[100][12]={"开心的"}的定义;这样adj[1]到adj[99]这99个词都会是空值(ASCII码为0),若用printf()函...

简单c语言程序
1、★编写程序,输入两个整数:1500和350,求出它们的商和余数并输出。main(){int a;int b;scanf("%d%d",a,b)printf("商:%d\\n余数:%d",a\/b,a%b);} 2、★编写程序,读入三个整数给a,b,c,然后交换它们中的数,把a中原来的值给b,b中原来的值给c, c中原来的值给a,且输出改变后...

我是编程的小白。大家帮忙看看这段编程。大神勿喷!!!
int max(int a,int b); \/\/程序声明 main() \/\/主程序,从这里开始 { int x,y,z; \/\/定义变量 int max(int a,int b); \/\/删!printf("input two numbers:\\n")\/\/输入两个数据 scanf("%d%d",&x,&y);\/\/输入两个数据 空格分隔 z=max(x,y); \/\/比较大小 printf("maxmum=%d"...

关于数据结构C语言二叉树的程序,请人帮忙看看~谢谢
给你完全调好了,一切正常运行:include "stdio.h"include "stdlib.h"typedef int status; \/\/C中没有status类型,所以想使用这个类型你必须定义它 define OK 0 define ERROR -1 define OVERFLOW -2 \/\/OK、OVERLFLOW、ERROR这些宏的定义头文件中是没有的,所以你必须自己定义它们 typedef struct ...

急 大家帮忙看看这个c语言写的加减乘除 不知道是什么问题啊,谢谢了
是提示下面的四个函数找不到吗?undefined??如果是,改变一下顺序,像下面这样就就可以了。还有,要注意 除法 分母不能为0.include <stdio.h> void cheng(float a,float b){ printf("%f",a*b);} void chu(float a,float b){ printf("%f",a\/b);} void jia(float a,float b){ pr...

刚开始学C, 大家帮忙看看这个判断最大值的程序 哪错了
int a,b,c;scanf("%d%d",&a,&b);c=max (a,b);printf ("max=%d\\n", c);} 这样应该可以了,是你函数声明和代码的问题 仔细看一下那里的知识应该很快就回了 在主函数前申请子函数并且写代码,是我这样,要是在主函数后写子函数代码,是这样 include <stdio.h> int max(int x, int ...

C语言单片机程序 初学大家帮忙看看错在哪里了 #include <reg51.h...
也有可能是你烧写程序的时候 数据传输的过程中出错了,校验出错 一般是传输过程中某个或者某些bit或者byte出错 建议你重新编译 重新下载烧写试试, 单片机这东西就是经常出些小问题,有时候我们买的开发板或者有些数据线质量不过关也会导致一些莫名其妙的问题,多尝试尝试 相信你能解决的 ...

C语言选择题 求大家帮忙看看 能帮我说说执行过程吗? 谢谢
程序改为用英文书写,去掉第一个空格:char s[]={"Girl"} ; \/\/初始化 char s[5]="Girl";s[0]=s[2]; \/\/ 字符串变为 "rirl"s[2]=s[0]; \/\/ 字符串变为 "rirl"s[1]=s[4]; \/\/ s[4] 是字符串结束符号 '\\0', 赋值后s[1] 也成字符串结束符,字符串变为 "r",s[4...

大学c语言!!编程题 帮忙看看我做的答案有没有错误!!谢谢大家了。
\/*程序1 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“正确!”,否则显示“错误!”,程序结束。*\/ include void main(void){ int a,b,s;printf("请输入两个数:");scanf("%d%d",&a,&b);printf("请输入%d+%d的结果=",a,b);scanf("%d",&s);if(s==a+b)p...

相似回答