读书人

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

发布时间: 2013-07-09 09:50:48 作者: rapoo

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 前面,能不先输出么...

额,,什么意思???

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

读书人网 >C语言

热点推荐