#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楼的回复是没用的,我要的是算法的解释,不是一句话的解释,而且二楼还犯了错误,把逻辑联系词和位运算搞混了
我是希望您能帮我看懂程序,告诉我算法是怎么一个样子
您帮我把算法看懂,然后告诉我啊,这是一个n皇后的程序,但是算法我看不懂
我用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...