| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2631 人关注过本帖
标题:求问九宫拼图怎么判断有无解
只看楼主 加入收藏
aa120824371
Rank: 2
来 自:广东汕头
等 级:论坛游民
帖 子:11
专家分:14
注 册:2012-10-30
结帖率:25%
收藏
已结贴  问题点数:20 回复次数:2 
求问九宫拼图怎么判断有无解
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 3
void show(int *p)//显示九宫格
{
    int i,j;
    printf("\t         \\\\\\|///\n");
    printf("\t        \\\\ .-.- //\n");
    printf("\t         ( .@.@ ) \n");
    printf("\t\t┏oOOo━━(_) ━━oOOo┓\n");
    printf("\t\t┃ ╲              ╱ ┃\n");
    printf("\t\t┃   ╔═╦═╦═╗   ┃\n");
    for(i=0;i<N;i++)
    {
        printf("\t\t┃   ║");
        for(j=0;j<N;j++)
        {
            if(*(p+i*3+j)==9)//当数值为9时显示空格
            {
                printf("  ║");
            }else
            {
                printf(" %d║",*(p+i*3+j));
            }
        }
        printf("   ┃\n");
        if(i>=2)
        {
            printf("\t\t┃   ╚═╩═╩═╝   ┃\n");
            printf("\t\t┃ ╱              ╲ ┃\n");
            printf("\t\t┗━━━━━━━━━━┛\n");
        }
        else
        {
            printf("\t\t┃   ╠═╬═╬═╣   ┃\n");
        }
    }
}
int num9(int *p)//判断空格所在位置
{
    for(int i=0;i<N*N;i++)
    {
        if(*(p+i)==N*N)
        {
            return i;
        }
    }
}
char shuru()//移动输入判断
{
    char x;
    for(;;)
    {
        fflush(stdin);
        x=getchar();
        if(x=='w'||x=='s'||x=='a'||x=='d')
        {
            break;
        }
        puts("输入错误!!");
    }
    return x;
}
int panduan(int *p)//判断是否完成
{
    int num=1;
    for(int i=0;i<N*N;i++)
    {
        if(*(p+i)==i+1)
        {
            num++;
        }
    }
    if(num<9)
    {
        return 0;
    }else
    {
        return 1;
    }
}
int shengcheng(int *p)//判断生成的是否是无解数
{
    int j,i,sum,temp;;
    for(i=0;i<N*N;i++)//利用插入法排序
    {
        for(j=i;j<N*N;j++)
        {
            if(*(p+j)==i+1)
            {
                sum+=j-i;
                temp=*(p+j);
                *(p+j)=*(p+i);
                *(p+i)=temp;
            }
        }
    }
    sum%=2;
    return sum;
}
void main()
{   
    int bu=0;
    srand(time(NULL));
    int i,j,num[N][N],num2[N][N];
    int *p,*q,judge;
    p=&num[0][0];
    q=&num2[0][0];
    for(;;)
    {
        for(i=0;i<N*N;i++)
        {
            *(q+i)=*(p+i)=rand()%(N*N)+1;
            for(j=0;j<i;)
            {
                if(*(p+j)==*(p+i))
                {
                    *(q+i)=*(p+i)=rand()%(N*N)+1;
                    j=0;
                }else
                {
                    j++;
                }
            }
        }
        judge=shengcheng(q);
        if(judge==0)//若为偶数则是有解得  奇数是无解的
        {
            break;
        }
    }
    printf("输入W S A D 来移动空格   \n");
    show(p);
    int k;
    int x,y;
    k=num9(p);
    x=k/N;
    y=k%N;
    int temp;
    char choose;
    for(;;)
    {
        fflush(stdin);
        choose=shuru();
        bu++;
        system("cls");
        printf("输入W S A D 来移动空格   \n");
        switch(choose)//移动 按照输入的字符让空格与想对应的数对换值
        {
        case 's':
            if(x==0)
            {
                puts("输入错误!");
            }
            else
            {
                temp=num[x][y];
                num[x][y]=num[x-1][y];
                num[x-1][y]=temp;
            }
            break;
        case 'w':
            if(x==N-1)
            {
                puts("输入错误!");
            }else
            {
                temp=num[x][y];
                num[x][y]=num[x+1][y];
                num[x+1][y]=temp;
            }
            break;
        case 'd':
            if(y==0)
            {
                puts("输入错误!");
            }else
            {
                temp=num[x][y];
                num[x][y]=num[x][y-1];
                num[x][y-1]=temp;
            }
            break;
        case 'a':
            if(y==N-1)
            {
                puts("输入错误!");
            }else
            {
                temp=num[x][y];
                num[x][y]=num[x][y+1];
                num[x][y+1]=temp;   
            }
            break;
        }
        
        show(p);
        k=num9(p);
        x=k/N;
        y=k%N;
        if(panduan(p))
        {
            printf("你一共用了%d步\n你通过了\n",bu);
            break;
        }
    }

}
偶的代码 求指导
搜索更多相关主题的帖子: 拼图 include 九宫格 
2012-11-17 10:19
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
找出所有的可行状态。可行状态数不超过362880,所以这个方案可行,而且还可以得到最少移动步数及移动路径。

重剑无锋,大巧不工
2012-11-17 10:25
aa120824371
Rank: 2
来 自:广东汕头
等 级:论坛游民
帖 子:11
专家分:14
注 册:2012-10-30
收藏
得分:0 
回复 2楼 beyondyf
求类似公式或代码
2012-11-17 10:27
快速回复:求问九宫拼图怎么判断有无解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037116 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved