`
lautherf
  • 浏览: 14967 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

数独 求解

 
阅读更多
android数独 解法逻辑


虽然说基本的数独都能解

网上查的那个最难的数独


{0,0,5,3,0,0,0,0,0},
{8,0,0,0,0,0,0,2,0},
{0,7,0,0,1,0,5,0,0},

{4,0,0,0,0,5,3,0,0},
{0,1,0,0,7,0,0,0,6},
{0,0,3,2,0,0,0,8,0},

{0,6,0,5,0,0,0,0,9},
{0,0,4,0,0,0,0,3,0},
{0,0,0,0,0,9,7,0,0}

看来需要添加假设模块呀?~


主要代码
public class Sudu_testActivity extends Activity  {
    /** Called when the activity is first created. */
	int sudu[][]={
			{0,0,0,0,0,0,0,0,0},
			{9,1,4,0,0,0,0,0,7},
			{5,7,0,0,6,0,0,0,0},

			{0,9,0,7,0,0,0,2,0},
			{0,0,2,6,0,0,0,7,9},
			{0,0,0,0,8,0,1,0,6},

			{0,3,7,0,0,0,0,0,4},
			{0,0,9,0,4,0,0,3,8},
			{0,0,0,5,0,0,0,0,0}
	};
	Piece piece[][];
	TextView showView;
	Thread thread;
	boolean stop=false;
	Button btn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        piece=new Piece[9][9];
        for(int i=0;i<9;i++)
        	for(int j=0;j<9;j++){
        		piece[i][j]=new Piece(sudu[i][j]);
        	}
        showView=(TextView)findViewById(R.id.show);
        btn=(Button)findViewById(R.id.star);
        btn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				run();
			}
        	
        });
        
        show();
        //thread=new Thread(this);
        //thread.start();
        
    }
    public void show(){
    	String t_str = "";
    	for(int i=0;i<9;i++){
        	for(int j=0;j<9;j++){
        		t_str=t_str+" "+piece[i][j].getShow();
        	}
    	t_str=t_str+"\n";
    	}
    	showView.setText(t_str);
    	showView.postInvalidate();
    }
	public void run() {
		// TODO Auto-generated method stub

		//hang row
		
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++){
				int t=piece[i][j].getShow();
				if(t==0)
					continue;
				else
				{
					//hang row
					for(int k=0;k<9;k++){
						
						if(piece[i][k].paichu(t))
						{
							show();
							return ;
						}
					}
					//only
					
					
				}
			}
		
		//lie
				for(int i=0;i<9;i++)
					for(int j=0;j<9;j++){
						int t=piece[i][j].getShow();
						if(t==0)
							continue;
						else
						{
							//hang row
							for(int k=0;k<9;k++){
								if(piece[k][j].paichu(t))
								{
									show();
									return;
								}
							}
							
						}
					}		
					
				//matrix
				for(int i=0;i<9;i++)
					for(int j=0;j<9;j++){
						int t=piece[i][j].getShow();
						if(t==0)
							continue;
						else
						{
							//hang row
							int row=i/3;
							int column=j/3;
							for(int k=0;k<9;k++){
								if(piece[row*3+k/3][column*3+k%3].paichu(t))
								{
									show();
									return;
								}
							}
							
						}
					}
				
				//only row
				for(int i=0;i<9;i++)
					for(int o=1;o<=9;o++){
						int num=0;
						int j=-1;
						for(int k=0;k<9;k++)
						{
							if(piece[i][k].maybe(o)){
								num++;
								j=k;
							}
						}
						if(num==1)
						{
							piece[i][j].setShow(o);
							show();
							return;
						}
					}
				
				//only column
				for(int j=0;j<9;j++)
					for(int o=1;o<=9;o++){
						int num=0;
						int i=-1;
						for(int k=0;k<9;k++)
						{
							if(piece[k][j].maybe(o)){
								num++;
								i=k;
							}
						}
						if(num==1)
						{
							piece[i][j].setShow(o);
							show();
							return;
						}
					}
				//only matrix
						
						for(int k=0;k<9;k++)
						{	

							int row=k/3;
							int col=k%3;
							for(int o=1;o<=9;o++)
								{
								int num=0;
								int t_i=-1;
								int t_j=-1;
								for(int i=0;i<3;i++)
									for(int j=0;j<3;j++)
									{
										if(piece[row*3+i][col*3+j].maybe(o)){
											num++;
											t_i=row*3+i;
											t_j=col*3+j;
											
										}
									}
								if(num==1)
								{
									piece[t_i][t_j].setShow(o);
									show();
									return;
								}
							}
							
						}
				
				
	}
}

public class Piece {
	int show;
	int left;
	int maybe;
	public Piece(){
		show=0;
		left=9;
		maybe=(int) 0x1ff;
	}
	public Piece(int t){
		if(t==0){
			show=0;
			left=9;
			maybe=(int) 0x1ff;
		}else{
			show=t;
			left=0;
			maybe=0;
		}
	}
	public void setShow(int t){
		if(t==0){
			show=0;
			left=9;
			maybe=(int) 01f;
		}else{
			show=t;
			left=0;
			maybe=0;
		}
	}
	public int getShow(){
		return show;
	}
	public boolean paichu(int t){
		int x=maybe&1<<(t-1);
		if(left!=0&&x!=0)
		{
			maybe-=(int)1<<(t-1);
			left--;
			if(left==1){
				setShow(leftnum());
				return true;
				}
			else
				return false;
		}
		else return false;
		
	}
	public int leftnum(){
		int t=maybe;
		int i=1;
		while(t/2!=0){
			t=t/2;
			i++;
		}
		return i;
	}
	public boolean maybe(int t){
		int x=maybe&1<<(t-1);
		if(x!=0)
			return true;
		else
			return false;
	}
}
分享到:
评论

相关推荐

    数独求解程序游戏设计报告书

    ### 数独求解程序游戏设计报告书 #### 一、数独游戏介绍 数独(Sudoku)是一种逻辑填数字游戏,玩家需按照一定的规则在9×9的网格内填入1至9的数字,使得每一行、每一列以及每一个3×3的小宫格内的数字都不重复。...

    数独求解源代码

    本主题提供的"数独求解C/C++源代码"是实现自动求解数独问题的程序。C++是一种广泛应用的编程语言,它支持面向对象编程,语法简洁高效,适合作为编写算法的工具。源代码是程序员编写的未经过编译器处理的原始程序,...

    数独求解的代码,在1秒内求解一般数独问题

    数独求解 数独求解 数独求解 数独求解 数独求解 数独求解

    数独求解 ACM C++算法 用时0到7ms

    数独求解是一种经典的逻辑推理游戏,而ACM(国际大学生程序设计竞赛)中的C++算法则要求在有限的时间内高效地解决此类问题。在这个特定的案例中,算法设计了一个非递归的方法,通过自动选择可能性最大的格子进行深度...

    数独求解算法程序(程序开发)

    为了解决这一挑战,计算机科学家和爱好者们开发了多种数独求解算法程序,旨在通过计算机技术自动化解决数独问题。 数独求解算法程序的核心是通过计算机算法来模拟玩家解决数独的思维过程。开发者们设计了多种算法来...

    数独求解器

    数独求解器 源程序数独求解器 源程序数独求解器 源程序

    数独求解程序

    本项目是针对数独求解设计的程序,旨在自动化解决各种难度的数独题目。通过深入理解数独的规则,开发者运用编程语言实现了算法,能够高效地找出唯一解。这样的程序通常会包含以下核心知识点: 1. **基础算法**:...

    数独求解代码C++代码

    在编程领域,实现一个数独求解器是常见的练习项目,可以帮助开发者提升算法设计和编程能力。本项目使用C++语言,基于MFC(Microsoft Foundation Classes)库构建了一个具有用户友好界面的数独求解小程序。 MFC是...

    C#做的数独求解

    "C#做的数独求解"程序就是利用编程语言C#实现的数独问题解决方案,它可以帮助玩家快速找到数独谜题的正确答案。 C#是微软公司开发的一种面向对象的编程语言,广泛应用于桌面应用、Web应用以及游戏开发等领域。在这...

    标准数独 数独求解 批量求解(附源码)

    而"数独求解2.exe"则是将这个.cpp文件编译后得到的可执行文件,它允许用户在Windows平台上直接运行,无需了解背后的编程细节。用户可以通过这个程序来检验自己的数独谜题,或者尝试批量解决一系列的数独题目。 利用...

    sudo_数独求解器_

    数独求解器是一种计算机程序,它利用算法解决数独谜题。在C++中实现一个数独求解器涉及到一系列编程和算法设计的技术。以下是对这个话题的详细阐述: 一、基础知识 1. C++语言:数独求解器是用C++编程语言编写的。...

    Sudoku.rar_CVX_MATLAB数独_数独_数独求解

    本压缩包"Sudoku.rar"包含了一个使用MATLAB和CVX软件包实现的数独求解算法。 MATLAB是一款强大的数学计算软件,广泛应用于科学计算、工程分析和数据可视化等领域。而CVX是MATLAB的一个扩展工具箱,专门用于处理凸...

    NINE_数独求解程序_pinkc1c_

    《数独求解程序的设计与实现——以pinkc1c的NINE.CPP为例》 数独,一种基于逻辑推理的数字填充游戏,以其独特的趣味性和挑战性深受全球玩家喜爱。在信息技术领域,数独求解程序是利用计算机算法解决数独问题的一种...

    网页版可离线的数独求解

    这个网页版的数独求解器采用纯JavaScript实现,意味着它无需依赖任何服务器端技术,用户可以在本地离线环境中直接运行和使用,这对于那些在网络不稳定或者希望保护隐私的用户来说是一大优点。 JavaScript,简称JS,...

    数独求解,满足学习娱乐需要

    本资源提供的是一款数独求解算法,旨在帮助玩家解决数独谜题,同时也适合学习者理解数独解题策略。 数独求解算法通常分为两类:搜索算法和逻辑算法。搜索算法如深度优先搜索(DFS)或回溯法,通过尝试填充空格并...

    C#数独求解程序(代码)

    标题中的"C#数独求解程序(代码)"指的是一个使用C#编程语言编写的软件应用,专门用于解决数独游戏。数独是一种逻辑谜题,玩家需要根据已给出的数字填充一个9x9的宫格,使得每一行、每一列以及每一个3x3的小宫格内的...

    【数学建模】基于整数规划完整的制作一个数独求解器(附MATLAB代码).zip

    这个压缩包文件“【数学建模】基于整数规划完整的制作一个数独求解器(附MATLAB代码).zip”提供了创建数独求解器的方法,特别是利用了整数规划这一数学工具,并附带了MATLAB代码实现。 整数规划是运筹学的一个分支...

    使用python原创开发的数独求解器

    数独求解器则是利用计算机算法来自动解决数独谜题的工具。 本文将详细讲解如何使用Python开发一个数独求解器。首先,我们需要理解数独问题的数学模型。在Python中,我们可以创建一个二维数组来表示9x9的网格,其中0...

    C++实现数独游戏的求解

    2. **递归算法**:数独求解的核心是回溯法,这是一种基于递归的算法。当找到一个可以唯一确定的空位时,我们填充该位置并进入下一个空位;如果所有空位都无法唯一确定,我们就回溯到上一个决策点,尝试填充其他可能...

    基于opencv的图片数独求解和数独题生成

    标题 "基于opencv的图片数独求解和数独题生成" 涉及的是使用OpenCV库处理图像,实现从图片中识别数独并解决数独题目的技术。OpenCV是一个强大的计算机视觉库,广泛应用于图像处理、图像分析和机器学习等领域。在这个...

Global site tag (gtag.js) - Google Analytics