[算法]游戏'数读’的基本解法 JAVA版。

昨天被我妹子虐了,做手机数读游戏。

想想毕业到现在这么多年没有写过算法类似的东西了,就写个事实。

首先先看最终版本 : http://www.dream-folio.com:8081/index.html 

方框里填数字,计算结果,请不要乱虐,毕竟个把小时的作品,肯定bug很多。


本文记录为主,注释什么的没有。。。代码什么的不能看。

/*
 * @(#) A.java 2014-5-12
 * 
 * Copyright 2010 NetEase.com, Inc. All rights reserved.
 */
package cn.zdfzboy.algorithm.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
/**
 *              {1,9,6,0,0,0,0,0,0},
                {0,0,0,0,0,8,3,0,0},
                {0,0,2,1,9,0,0,0,0},
                {0,2,0,0,8,0,0,0,7},
                {0,0,5,2,0,1,8,0,0},
                {7,0,0,0,6,0,0,3,0},
                {0,0,0,0,1,6,4,0,0},
                {0,0,7,4,0,0,0,0,0},
                {0,0,0,0,0,0,9,8,5},
                
                ----------------------
                    {7,0,8,0,0,0,3,0,0},
                    {0,0,0,2,0,1,0,0,0},
                    {5,0,0,0,0,0,0,0,0},
                    {0,4,0,0,0,0,0,2,6},
                    {3,0,0,0,8,0,0,0,0},
                    {0,0,0,1,0,0,0,9,3},
                    {0,9,0,6,0,0,0,0,4},
                    {0,0,0,0,7,0,5,0,0},
                    {0,0,0,0,0,0,0,0,0},
                
                
                
                
 * @author JWW
 *
 */
public class Readings {
    public boolean stop = false;
    public int[][] last;
    
    public static void main(String args[]){
        int[][] m = {
            {3,0,0,9,0,0,0,0,0},
            {0,1,0,0,2,0,0,5,0},
            {0,0,0,0,0,8,0,0,6},
            {8,0,0,7,0,0,3,0,0},
            {0,3,0,0,5,0,0,1,0},
            {0,0,7,0,0,6,0,0,2},
            {6,0,0,0,0,0,8,0,0},
            {0,2,0,0,1,0,0,0,0},
            {0,0,0,0,0,9,0,0,0},
        };
        
        Readings r = new Readings();
        r.getTab(m, 6);
        r.earth(m);
        r.print(r.last);
    }
    public boolean check(int[][] m,int value,int i,int j){
        for(int k=0;k<9;k++){
            if(m[i][k] == value || m[k][j] == value)
                return false;
        }
        return true;
    }
    public  void earth(int[][] m){
        if(stop){
            return;
        }
        List<PossibleNumber> pn = getPossibleNumber(m);
        if(pn.size() == 0 ){
            last = m;
            stop = true;
            return;
        }
        boolean tag = false;
        for(PossibleNumber p : pn){
            if(p.size == 0) { 
                return;
            }
            if(p.size == 1){
                tag = true;
                if(check(m,p.possible[0],p.i,p.j)){
                    m[p.i][p.j] = p.possible[0];
                }else{
                    return;
                }
                
            }
        }
        
        if(tag){
            earth(m);
            return;
        }
        
        for(PossibleNumber p : pn){
            if(p.size == 2){
                int[][] c1 = clone(m);
                c1[p.i][p.j] = p.possible[0];
                int[][] c2 = clone(m);
                c2[p.i][p.j] = p.possible[1];
                earth(c1);
                earth(c2);
                return;
            }
          
        }
        System.out.println("=-");
    }
    
    public  int[][] clone(int[][] m){
        int[][] copy=new int[m.length][];
        for(int i=0;i<m.length;i++){
            copy[i]=Arrays.copyOf(m[i], m[i].length);
        }
        return copy;
    }
    
    public  List<PossibleNumber> getPossibleNumber(int[][] m){
        Integer[] empty = {};
        List<PossibleNumber> l = new ArrayList<PossibleNumber>();
        for(int i=0;i<m.length;i++){
            for(int j=0;j<m[i].length;j++){
                if(m[i][j] == 0){
                    PossibleNumber p = new PossibleNumber();
                    p.i = i;
                    p.j = j;
                    HashSet<Integer> h = init();
                    for(int z : getTab(m,((i/3)*3)+j/3)){
                        if(z == 0)
                            continue;
                        h.remove(z);
                    }
               
                    for(int k=0;k<9;k++){
                        if(m[i][k] != 0)
                            h.remove(m[i][k]);
                        if(m[k][j] != 0)
                            h.remove(m[k][j]);
                    }
                    p.possible = h.toArray(empty);
                    p.size = h.size();
                    l.add(p);
                }
            }
        }
        return l;
    }
    public  int[] getTab(int[][] mia,int k){
        int[] ss = new int[9];
        int ii =0;
        for(int i=(k/3)*3;i<(k/3)*3 + 3;i++){
            for(int j=(k%3)*3;j<(k%3)*3 + 3;j++){
                ss[ii] = mia[i][j];
                ii++;
            }
            
        }
        return ss;
    }
    
    public  HashSet<Integer> init(){
        HashSet<Integer> h = new HashSet<Integer>();
        for(int i = 1;i <= 9;i++){
            h.add(i);
        }
        return h;
    }
    
    public  void print(int[][] m){
        for(int i=0;i<m.length;i++){
            for(int j=0;j<m[i].length;j++){
                System.out.print(m[i][j] + " ");
            }
            System.out.println(" ");
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值