首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言骑士漫游的一个小程序,有点小异常,

2013-07-09 
C语言骑士漫游的一个小程序,有点小错误,求助~~~]#includestdio.h#includestdlib.h#includectype.h#i

C语言骑士漫游的一个小程序,有点小错误,求助~~~

]#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h> 
#define N 50
////////////////////////////////////////////// 
int n,m;
int count=0,t=1;
int num[N+1][N+1],point1[N+1],point2[N+1];
int input();
void evaluat();
void knight(int x1,int y1,int x2,int y2);
double number(int x1,int y1,int x2,int y2 );
//////////////////////////////////////////////
void main()
{

int i,x1,y1,x2,y2,times=1;
char judge;
clock_t start, finish;
double duration;
do
{
system("cls");
printf("\n****************骑士巡游游戏****************\n"); 
printf("\n开始第>>>>>>>>>>     %d     <<<<<<<<<<次游戏\n",times); 
printf("\n输入棋盘大小,长宽均大于2小于50\nn=");
 n=input(2,N);
 printf("m=");
 m=input(2,N); 
count=0;
t=1;
 evaluat();
 start = clock();
 knight(1,1,n,m);
 if(count==0)
{
printf("\n从(1,1)->(%d,%d)之间无路径",n,m);
}
else
{
count=number(2,3,n,m)+number(3,2,n,m)+number(3,0,n,m)+number(2,-1,n,m);
printf("\n从(1,1)->(%d,%d)之间有%d条路径,\n其中一条为:",n,m,count);
for(i=1;i<t;i++)
{
printf("(%d,%d)",point1[i],point2[i]);
if(i<t-1) printf("->");
}
}
finish = clock();
   duration = (double)(finish/1000 - start/1000); 
  printf( "\n用时%.0f seconds\n", duration );
printf("\n下面请输入\n\n骑士起点:x1=");
x1=input(1,n);
printf("y1=");
y1=input(1,m);
printf("\n骑士终点:x2=");
x2=input(1,n);
printf("y2=");
y2=input(1,m);
count=0;
evaluat();
count=number(x1+1,y1+2,x2,y2)+number(x1+2,y1+1,x2,y2)+number(x1+2,y1-1,x2,y2)+number(x1+1,y1-2,x2,y2);
printf("\n从(%d,%d)->(%d,%d)之间有%d条路径。\n",x1,y1,x2,y2,count);
printf("\n是否重玩?Y(是),其他键退出\n");
scanf(" %c",&judge);
times++;

}while(judge=='Y'||judge=='y');
 printf("游戏结束!");

}
//骑士遍历所有路径,并记录第一条路径 
void knight(int x1,int y1,int x2,int y2)
{
if(count==0)//当路径数为0时,记录点的坐标 
{
point1[t]=x1;
point2[t]=y1;
t++;
}
if((x1==x2)&&(y1==y2)) 
{
count=1;//找到一条路径,hw=false; 
return;
}
if((y1>=1)&&(y1<=m)&&(x1<x2))//以当前点作为起点,遍历下面的点 


{
knight(x1+1,y1+2,x2,y2);
if(count==0)t=t-1;
else return;
knight(x1+2,y1+1,x2,y2);
if(count==0)t=t-1;
else return;
knight(x1+2,y1-1,x2,y2);
if(count==0)t=t-1;
else return;
knight(x1+1,y1-2,x2,y2);
if(count==0)t=t-1;
else return;
}
return;

double number(int x1,int y1,int x2,int y2 )
{

double nn=0;
if(num[x1][y1]!=-1)
{
return num[x1][y1];
}
if(y1>=1&&y1<=m&&x1<=x2)
{
if((x1==x2)&&(y1==y2)) 
{num[x1][y1]=1;
return 1;
}
else
{
nn=number(x1+1,y1+2,x2,y2)+number(x1+2,y1+1,x2,y2)+number(x1+2,y1-1,x2,y2)+number(x1+1,y1-2,x2,y2);
num[x1][y1]=nn;
}
}
return nn;

//判断输入的字符是否合法
int input(int lim1,int lim2) 
{
char str[10];
int x;
gets(str);
while(1)
{
x=atoi(str);
if(strlen(str)==1&&isdigit(str[0]))
{
if(x>=lim1)
return x;
}
if(strlen(str)==2&&isdigit(str[0])&&isdigit(str[1]))
{
if(x<=lim2)
return x;
}
printf("\n输入错误,请重新输入!\n");
gets(str);
}
}
void evaluat()
{
int i,j;
for(i=0;i<=N;i++)
{
for(j=0;j<N;j++)
{
num[i][j]=-1;
}
}




[解决办法]
你printf (输入错误)放在 gets 前面,能不先输出么...
[解决办法]
额。 怎么你用[code] 把一行给扩进来了
这样别人阅读不方便啊
[解决办法]

引用:
Quote: 引用:

你printf (输入错误)放在 gets 前面,能不先输出么...

额,,什么意思???

不好意思,没注意到. 建议你以后贴代码的时候,前面加
,后面加
,方便阅读.

热点排行