当前位置:首页 > 资格考试 > 正文

C++的这道简单题为什么是60分,求高手解哪里出错了

求C语言编程大佬帮忙!这道题的逻辑哪里出错了!找了几个小时了没搞明白!

代码有点乱,不太看得清思路,里面有一些数组越界访问的情况,算法是否有效未知,重写了一个供参考。

思路如下:

这个问题实际上是生成0~9的全排列,然后根据每个数在格子里的位置判断每个排列是否符合要求。百度了一个全排列算法稍做修改,得到以下代码,输出的有效方案数是1580,在我这里输出大约在70ms到100ms左右。百度这个代码排版垃圾得无以复加,vs里面排得好好复制过来全乱,不再重排了。

另外,生成排列数以后,这个格子问题其实应该能转化为纯数学算法来判断,不需要真的填什么表的,我懒得想太多,填表和判断部分的代码有点玩的性质。

#include
//#include//测试执行时间的GetTickCount()引用
//#include//测试执行时间的GetTickCount()引用
constintROW=5;//增加两行用于减少边界判断,实际使用中间3行
constintCOL=6;//增加两列用于减少边界判断,实际使用中间4列
constintBORDER=-11;//表格边界标记
constintNON=-9;//标记表格有效内容的起止位置
intgrid[ROW][COL];//表格数组
intcount;//有效方案计数
voidInitGrid(void);//初始化表格,设置边界和标记表格有效内容的起止位置
voidPrintGrid(void);//打印输出有效方案
voidPerm(intlist[],intk,intm);//递归生成排列数,生成的排列数输出到表格中,然后判断是否打印和计数
voidSwap(int&a,int&b);//引用、交换函数,用于递归生成排列数函数
voidPermOutput(intlist[]);//排列数填表、判断、打印、计数
voidmain(void)
{
//longstart_time,end_time;//记录测试执行时间起止的变量
intnum[10]={0,1,2,3,4,5,6,7,8,9};//0~9数值序列
//start_time=GetTickCount();//获取此程序段开始执行时间

count=0;
InitGrid();
Perm(num,0,10);
//end_time=GetTickCount();//获取此程序段执行结束时间
//printf("\nCount=%din%ldms\n",count,end_time-start_time);//打印输出程序执行时间
getchar();
}
//初始化表格,设置边界和标记表格有效内容的起止位置
voidInitGrid(void)
{
inti,j;

for(i=0;i{
for(j=0;j{
grid[i][j]=BORDER;//设置边界
}
}
//设置有效内容的起止位置
grid[1][1]=NON;
grid[ROW-2][COL-2]=NON;
}
//打印输出有效方案
voidPrintGrid(void)
{
inti,j;

printf("-----------\n");
for(i=1;i{
for(j=1;j{
if(grid[i][j]!=NON)
printf("%5d",grid[i][j]);//有效值
else
printf("%5s","");//有效值起止位置
}
printf("\n");
}
}
//递归生成排列数,生成的排列数输出到表格中,然后判断是否打印和计数
voidPerm(intlist[],intk,intm)//k表示前缀的位置,m是要排列的数目。
{
inti;
if(k==m-1)//前缀是最后一个位置,表示m位排列数已生成,判断是否有效方案并打印和记数。
{
PermOutput(list);
}
else//否则进入递归生成一下个排列数位
{
for(i=k;i{
//交换前缀,使之产生下一个前缀.
Swap(list[k],list[i]);
Perm(list,k+1,m);
//将前缀换回来,继续做上一个的前缀排列.
Swap(list[k],list[i]);
}
}
}
//引用、交换函数,用于递归生成排列数函数
voidSwap(int&a,int&b)
{
inttemp=a;a=b;b=temp;
}
//排列数填表、判断、打印、计数
voidPermOutput(intlist[])
{
inti,j,n;//n用于引用grid[i][j]的值提高效率
boolok;//方案有效标记
//将排列数填入表格中
n=0;
for(i=1;i{
for(j=1;j{
if(grid[i][j]!=NON)
{
grid[i][j]=list[n];
n++;
}
}
}
//判断表格中是否有相邻的数字
ok=true;
for(i=1;i{
for(j=1;j{
n=grid[i][j];
if((grid[i-1][j-1]==n-1)||((grid[i-1][j-1]==n+1))||//左上
(grid[i-1][j+1]==n-1)||((grid[i-1][j+1]==n+1))||//右上
(grid[i-1][j]==n-1)||((grid[i-1][j]==n+1))||//上
(grid[i][j-1]==n-1)||((grid[i][j-1]==n+1))||//左
(grid[i][j+1]==n-1)||((grid[i][j+1]==n+1))||//右
(grid[i+1][j]==n-1)||((grid[i+1][j]==n+1))||//下
(grid[i+1][j-1]==n-1)||((grid[i+1][j-1]==n+1))||//左下
(grid[i+1][j+1]==n-1)||((grid[i+1][j+1]==n+1))//右下
)
{
ok=false;//发现任一相邻数则设置失败标记,跳出该轮循环
break;
}
}
if(!ok)//如标记为失败,跳出外层循环
break;
}
//如标记为成功,方案有效,打印输出
if(ok)
{
//PrintGrid();//打印输出有效方案
count++;
}
}

c语言题目,这个题怎么算答案都算不对,不知道哪里错了,漏了,不知道有没有人能解出来的

填3.6。 只要知道'/'是整除符号,符号前后都是整数结果只保留整数,否则就是浮点数。 所以这里2/3是0,m/2是2。(小数部分都被忽略了)。 所以s想等于8,原式子就变成:8=0+2*y/1.2+2。解个方程就知道y应该是3.6。

我刚学C语言,这是一个C语言的简单编程问题,请问哪里出现错误了?

输入不要加逗号,就好了。 scanf("%d %f", &NUMBERS, &PRICE);

求大佬解决这到C语言题,指出哪里有错误,帮我写一下正确的程序,万分感谢QAQ

#include
#defineMAXN10
voidf(longintx,char*p);
intmain()
{longintx;
chars[MAXN]="";
scanf("%ld",&x);
f(x,s);printf("%s\n",s);
return0;
}
voidf(longx,char*s)
{
inti=0,j=0,c;
if(x<0){s[0]='-';x=-x;i=j=1;}
do{
s[i]=x%16;
s[i]+=s[i]<10?48:55;
i++;
x/=16;
}while(x>0);
s[i]='\0';
for(i--;j{c=s[j];s[j]=s[i];s[i]=c;}
}

求问这道C语言编程题我哪儿出错了

看清楚题目要求,是加9,不是加10!
展开全文阅读