首页
社区
课程
招聘
[旧帖] [原创]趣味C程序设计--移动数字 0.00雪花
发表于: 2011-12-7 23:18 942

[旧帖] [原创]趣味C程序设计--移动数字 0.00雪花

2011-12-7 23:18
942
问题:

         在图中的九个点上,空出中间的点,其余的点上任意填入数字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直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//