3*3 型的拼图界面。数字1~8 和一个空格。要实现能拼图功能?~~大概的算法是怎样的!!
#include #include #include #include int main(void) { void swap(int *a,int *b); //子函数声明 int i,j,k,n,puzzle[81]={0},parity[81]={0}; //拼图数组和奇偶性数组 char ch; //用来记录拼图数组可以转换成顺序矩阵,还是逆序矩阵 printf("游戏说明
"); printf("↑ :数字向上 ↓ :数字向下
"); printf("← :数字向左 → :数字向右
"); printf("Esc:退出程序 Space:重置矩阵...全部
#include #include #include #include int main(void) { void swap(int *a,int *b); //子函数声明 int i,j,k,n,puzzle[81]={0},parity[81]={0}; //拼图数组和奇偶性数组 char ch; //用来记录拼图数组可以转换成顺序矩阵,还是逆序矩阵 printf("游戏说明
"); printf("↑ :数字向上 ↓ :数字向下
"); printf("← :数字向左 → :数字向右
"); printf("Esc:退出程序 Space:重置矩阵
"); printf("
"); loop1: printf("难度设置
n:"); scanf("%d",&n); loop2: system("cls"); //清屏 srand((unsigned)time(NULL)); //动态获取数据 for(i=0;iparity[j]) k ; //求奇偶性数组的“逆序数和” } if(k%2==0) printf("%d
顺序矩阵",n),ch='0'; //“逆序数和”为偶数时,是顺序矩阵 else printf("%d
逆序矩阵",n),ch='1'; //“逆序数和”为奇数时,是逆序矩阵 printf("
"); for(i=0;i1*(n-1)) swap(&puzzle[i],&puzzle[i-n]);break; //数字向下 case 75:if((i 1)%n!=0) swap(&puzzle[i],&puzzle[i 1]);break; //数字向左 case 77:if((i 0)%n!=0) swap(&puzzle[i],&puzzle[i-1]);break; //数字向右 case 27:exit(0); //退出程序 case 32:goto loop2; //重置矩阵 } system("cls"); //清屏 switch(ch) { case '0':printf("%d
顺序矩阵
",n);break; //完成拼图的最终目标 case '1':printf("%d
逆序矩阵
",n);break; //完成拼图的最终目标 } for(i=0;i { if(puzzle[i]==0) printf("%*c",n,' '); //是0(空格)的位置,打印空格 else printf("%-*d",n,puzzle[i]); //是数字的位置,打印对应宽度的数字 if((i 1)%n==0&&i!=n*n-1) printf("
"); //每打印n个数字,换一行打印 } for(i=0;i { if(puzzle[i]!=i) break; //判断拼图数组是否为顺序矩阵或逆序矩阵 } if(i==n*n-2) { //是顺序矩阵或是逆序矩阵时,完成拼图 printf("
恭喜你,拼图完成了!
"); //打印完成标志 printf("Continue(y/n)?"); if(getch()=='y') { system("cls"); //清屏 goto loop1; //重新开始 } else { exit(0); //退出程序 } } } getch(); //显示运行结果 return(0); //正常运行返回0 } void swap(int *a,int *b) { int c; c=*a; *a=*b; *b=c; }。
收起