-
-
[旧帖] [原创]趣味C程序设计--移动数字 0.00雪花
-
发表于: 2011-12-7 23:18 942
-
问题:
在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点.
请编程显示数字移动过程?
题目解释建下面链接:
http://www.kuqin.com/tiku/20080425/7623.html
由于时间的原因所以暂时不写算法设计的具体步骤,只给出自己编写的代码(估计算法的实现不是很好,所以代码量比较大,有什么好方法,还望分享下啊!谢谢咯!!!)。改天一定补上!见谅啊!
在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点.
请编程显示数字移动过程?
题目解释建下面链接:
http://www.kuqin.com/tiku/20080425/7623.html
由于时间的原因所以暂时不写算法设计的具体步骤,只给出自己编写的代码(估计算法的实现不是很好,所以代码量比较大,有什么好方法,还望分享下啊!谢谢咯!!!)。改天一定补上!见谅啊!
#include<stdio.h> void printData(int a[2][9],int b[9]); void displacement(int a[2][9],int b[9]); void main() { int dataOne[2][9]={ //存放矩阵的八个数 {0,1,2,3,8,4,7,6,5}, {0,0,0,0,0,0,0,0,0} }; int dataTwo[2][9]={ {0,1,2,3,4,5,6,7,8}, {0,0,0,0,0,0,0,0,0} }; int sign_1; //做标记 int locate1[9]={0}; //存放坐标 int locate2[9]={22,0,0,0,0,0,0,0,0}; int a[4][4]={ //用于输出和存储矩阵 {0,0,0,0}, {0,1,2,3}, {0,4,0,5}, {0,6,7,8} }; int count=0,i,j,k; printf("\t数字移动\n\n"); printf("请按下面顺序输入数字(1~8):\n"); //输出数输出的顺序 for(i=1;i<4;i++) { printf("\t"); for(j=1;j<4;j++) { if(i==2&&j==2) printf(" "); else printf("%d ",a[i][j]); } printf("\n"); } printf("\n"); //按顺序输入数字 for(k=1;k<9;k++) { printf("输入第%d个数: ",k); scanf("%d",&dataOne[1][k]); } //把数字放入矩阵 for(i=1;i<4;i++) for(j=1;j<4;j++) { count++; if(i==2&&j==2) { locate1[0]=10*i+j; count--; } else { a[i][j]=dataOne[1][count]; locate1[count]=10*i+j; } } //输出矩阵观察是否正确 printf("\n矩阵数字移动前:\n"); for(i=1;i<4;i++) { printf("\t"); for(j=1;j<4;j++) { if(i==2&&j==2) printf(" "); else printf("%d ",a[i][j]); } printf("\n"); } //输出矩阵的坐标 printf("各个在矩阵的坐标:\n"); for(i=1;i<9;i++) printf("%d ",locate1[i]); printf("\n\n"); //找出1所在的位置 for(i=1;i<9;i++) if(dataOne[1][i]==1) sign_1=i; //把dataOne的做转换存在dataTwo中 count=1; dataTwo[1][1]=1; locate2[1]=locate1[sign_1]; for(i=sign_1+1;i<9;i++) //把1后面的数处理掉 { count++; for(k=1;k<9;k++) if(dataOne[0][k]==i) { dataTwo[1][count]=dataOne[1][k]; locate2[count]=locate1[k]; } } for(i=1;i<sign_1;i++) //把1前面的数处理掉 { count++; for(k=1;k<9;k++) if(dataOne[0][k]==i) { dataTwo[1][count]=dataOne[1][k]; locate2[count]=locate1[k]; } } printf("数在dataOne中是:\n"); printData(dataOne,locate1); printf("数在dataTwo中是:\n"); printData(dataTwo,locate2); displacement(dataTwo,locate2); } //输出数组中的数和对应的坐标 void printData(int a[2][9],int b[9]) { int i; for(i=1;i<9;i++) printf("%d ",a[1][i]); printf("\n坐标是:\n"); for(i=1;i<9;i++) printf("%d ",b[i]); printf("\n\n"); } //实现移位并输出移位的顺序 void displacement(int a[2][9],int b[9]) { int i,j,k; int flag_1=0,flag_2=0,sign; for(i=2;i<9;i++) //找目标 { flag_1=0; //一定要重新复位0,不然出现一次1以 //后在后面的循环就总是不移动了的 for(j=i;j<9;j++) { if(a[1][i]==i)//要找到位置恰好在第一个位置 { flag_1=1; break; } else if(a[1][j]==i) { flag_2=1; sign=j; //不是第一个位置,坐标记 break; } } if(flag_1==1) //恰好在第一个位置,就什么也不做 continue; else //走则将其移到中间 { b[0]=b[sign]; a[1][0]=i; printf("(%d,%d)->(%d,%d)\n",(b[sign]/10),(b[sign]%10),2,2); for(k=sign;k>i;k--) { printf("(%d,%d)->(%d,%d)\n",b[k-1]/10,b[k-1]%10,b[k]/10,b[k]%10); b[k]=b[k-1]; //坐标也向后移动一个 a[1][k]=a[1][k-1]; //往后移动一个位置 } //在把目标从中间移到指定的位置 printf("(%d,%d)->(%d,%d)\n",2,2,b[i]/10,b[i]%10); b[0]=22; //中间地址复原 a[1][i]=a[1][0]; //从开始移到最后 printf("\n"); }//if-else }//for(,,,) if(flag_2==0) printf("\n不需要移动任何数就是符合题意的!\n"); }
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
看原图
赞赏
雪币:
留言: