手动移动的八数码程序相关(非算法)

最近看哈佛公开课cs50,里面有fifteen的例子,然后就搜了下相关的,简单的就是8数码。

这是一位不知道名字大侠写的程序,太厉害了,看半天,我添加了些注释,方便看懂。

下图所示,最初状态是随机生成的,通过上下左右键移动,输入q或Q退出。

这程序不涉及算法的问题,只是手动自己排序。


手动移动的八数码程序相关(非算法) - clzhl_2004 - 白的共享空间


程序:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>

#define UP    72
#define DOWN  80
#define LEFT  75
#define RIGHT 77

void DrawArray(int array[])//画图形
{
    int i,j;
    for(i=0;i<3;i++)
    {
        printf("\n\n\t\t\t");//普通格式
        for(j=0;j<3;j++)
            if(array[i*3+j]==0)    printf(" \t\t",array[i*3+j]);//空的那一位原先是0,现在用\t\t替代
            else   printf("%d\t\t",array[i*3+j]);//输出3行3列数

    }

}
void Move(char c,int array[])//移动
{
    int i,j;
    for(i=0;i<9;i++)if(array[i]==0)break;//判断0所在的位置
    switch(c)//围绕0来做上下左右移动,自己画出来仔细看看就能明白。
    {
        case UP:j=((i+3>8)?-1:i+3);break;
        case DOWN:j=((i-3<0)?-1:i-3);break;
        case LEFT:j=((i==2||i==5||i==8)?-1:i+1);break;
        case RIGHT:j=((i==0||i==3||i==6)?-1:i-1);break;
        default:j=-1;

    }
    if(j!=-1){array[i]=array[j];array[j]=0;}//交换0与移动的数字

}
void Init(int array[])//最开始的随机图形
{
    int i,j,sum=0;
    srand(time(0));
    do
    {
        sum=0;
        for(i=0;i<8;i++)
        {
             array[i]=rand()%8+1;//产生1-8的随机数
        }
        for(i=0;i<8;i++)
        {
            for(j=0;j<i;j++)
                if(array[j]==array[i])
                {
                    array[i]=array[i]+1;
                    if(array[i]==9)array[i]=1;
                    j=-1;//如果出现重复就重新再比较一次,如果没有这个,还是可能重复
                }//随机数可能重复,以上程序让随机数为不重复的12.....8个数字
        }
        for(i=0;i<8;i++)
            for(j=i+1;j<8;j++)
                if(array[i]>array[j])sum++;
    }while(sum%2!=0);//防止无解,偶排列只能变换成偶排列,奇排列也同理。在本题中最终变换的是7+6+...+1=28是偶排列,所以初始值也要是偶排列。具体就自己google吧,技术文档百度就算了!
    for(i=8;i>=5;i--)array[i]=array[i-1];
    array[4]=0;//将0插到中间
}
int Win(int array[])
{
    int i;
    for(i=0;i<4;i++)if(array[i]!=i+1)return 0;//0不成功
    for(i=5;i<9;i++)if(array[i]!=i)return 0;
    return 1;//1成功
}
main()
{
    char c;
    int array[9],init[9];
    Init(array);
    for(c=0;c<9;c++) init[c]=array[c];
    do
    {
         system("cls");//如果是TC请替换成clrscr();如果是linux shell,还可以用printf("\033[2J");printf("\033[%d;%dH", 0, 0
);清屏
         printf("请用上下左右四个键将下面的数字排成这个样子:\n");
         printf("1 2 3 \n4   5\n6 7 8");
         printf("\n最初状态是:\n");
         printf("%d %d %d\n%d   %d\n%d %d %d",init[0],init[1],init[2],init[3],init[5],init[6],init[7],init[8]);
         printf("\n祝你好运!\n");
         DrawArray(array);
         if(Win(array))
        {
             printf("\n\n\t\t你赢了!好棒!!\t");
             c='q';
             break;
        }
         c=getch();
        if(c<0)continue;
        Move(c,array);

    }while(c!='q'&&c!='Q');//输入q键退出
    getch();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章