zhx740931045 2017-08-30 06:41 采纳率: 0%
浏览 761

谁能帮帮忙,八数码问题,差一些地方,我已经标注出来了

#include
#include
#include
#include
#define N (3)
void swap(char*a,char*b){
char t=*a;
a=*b;
*b=t;
}
void shuffle(char
a,int len){
int i;
for(i=0;i swap(a+rand()%len,a+rand()%len);
}
enum {LEFT,UP,RIGHT,DOWN};
typedef struct //图形,其中ij表示0(即空位)的位置
{
char a[N*N];
char ij;
}G;
void init(G *g)//伪随机初始图形,仅生成有解的
{
int i,j; //char t[]={0,2,7,3,1,6,8,4,5};
for(i=0;i g->a[i]=i;//t[i];
int count;
//随机打乱且保证有解
do{
count=0;
shuffle(g->a,N*N);
for(i=0;i for(j=i;j if(g->a[j]&&g->a[i]>g->a[j])++count;
}while(count&1);

for(i=0;i<N*N;++i)
       if (!g->a[i])
       {
            g->ij=i;
            break;
       }      

}
void print(const G* g)//打印图形,可给学生调试用
{
int i,j;
for(i=0;i {
for(j=0;j if ( g->a[i*N+j]) printf("%3d",g->a[i*N+j]);
else printf(" " );
printf("\n");
}
}
bool move(G*g,int n)//移动,可给学生调试用
{
if(n==LEFT)//右侧向空位填充为“左”操作
{
if(g->ij%N==N-1) return 0;
g->a[g->ij]=g->a[g->ij+1];
g->a[g->ij+1]=0;
++g->ij;
}
if(n==UP)//下侧向空位填充为“上”操作
{
if(g->ij/N==N-1) return 0;
g->a[g->ij]=g->a[g->ij+N];
g->a[g->ij+N]=0;
g->ij+=N;
}
if(n==RIGHT)//左侧向空位填充为“右”操作
{
if(g->ij%N==0) return 0;
g->a[g->ij]=g->a[g->ij-1];
g->a[g->ij-1]=0;
--g->ij;
}
if(n==DOWN)//上侧向空位填充为“下”操作
{
if(g->ij/N==0) return 0;
g->a[g->ij]=g->a[g->ij-N];
g->a[g->ij-N]=0;
g->ij-=N;
}
return 1;
}
bool isok(const G* g)
{
int i;
for(i=0;i if(g->a[i]!=i) return 0;
return 1;
}
int player(const G*g,int * step)
{
//填写代码从此开始,g是将初始图形,
//解决方法写在数组step中,里面就写0123表示左上右下,返回值为数组step的长度,即步数
int i=0;
G my=*g;
while(!isok(&my))
{
int x;
print(&my);
scanf("%d",&x);
move(&my,x);
step[i++]=x;
}
return i;
}
int main()
{
#define M 1 //玩几把
G g[M];
int sum_step=0;
int sum_time=0;
int step[1000];
int i,j;
for(i=0;i<M;++i)
init(g+i);
for(i=0;i<M;++i)
{
int t=clock();
int n=player(g+i,step);
t=clock()-t;
for(j=0;j<n;j++)
move(g+i,step[j]);
if(!isok(g+i)) break;
sum_time+=t;
sum_step+=n;
}
if(i<M) printf("第%d组测试未完成\n",i);
else printf("总用时%d毫秒,总步数%d,成绩%f\n",sum_time,sum_step,sum_time/10.0+sum_step);
return 0;
}

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥30 这是哪个作者做的宝宝起名网站
    • ¥60 版本过低apk如何修改可以兼容新的安卓系统
    • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
    • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
    • ¥50 有数据,怎么用matlab求全要素生产率
    • ¥15 TI的insta-spin例程
    • ¥15 完成下列问题完成下列问题
    • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
    • ¥15 YoloV5 第三方库的版本对照问题
    • ¥15 请完成下列相关问题!