dance links解数独

原文链接:http://www.zerob13.in/2009/10/30/java%E7%9A%84dance-links%E8%A7%A3%E6%95%B0%E7%8B%AC/

package com.zerob13.Sudoku;
import java.util.*;
/**
 * @author yanglingfeng
 *
 */
class node{
    public int x,y,l,r,u,d;
    public int sum;
    public int f;
    public  char now;
   public node(){
    	x=0;
    	y=0;
    	l=0;
    	r=0;
    	u=0;
    	d=0;
    	sum=0;
    	f=0;
    	now=0;
    }
}
public class Sudoku {
	private int n,m;
	private int cnt;
	private char[][] map;
	private int x;
	private int y;
	private char nn;
    node[] p;
    public Sudoku(){
    	 n=9*9*9+1;
    	 m=9*9*4+1;
    	 int i,j,k;
    	 boolean[][] row,col,cube;
    	 row=new boolean[9][19];
    	 col=new boolean[9][19];
    	 cube=new boolean[9][19];    	
    	map=new char[29][29];
    	Scanner read=new Scanner(System.in);
    		String a;
    		int L=0;
    		for(i=0;i<9;i++){
    			a=read.nextLine();
    			L=0;
    			for(j=0;j<a.length();j++)
    			{
    				if(a.charAt(j)!=' ')
    				map[i][L++]=a.charAt(j);
    			}
    		}
    		 for(i=0;i<9;i++)
    		    {
    		        for(j=0;j<9;j++)
    		        {
    		            if(map[i][j]!='?')
    		            {
    		                row[i][map[i][j] - '1'] = true;
    		                col[j][map[i][j] - '1'] = true;
    		                cube[i / 3 * 3 + j / 3][map[i][j] - '1'] = true;
    		            }
    		        }
    		    }
    		 	p=new node[n*m];
    		 	for(i=0;i<n*m;i++)
    		 	{
    		 		p[i]=new node();
    		 	}
    		 	p[0].l=324;
    		    p[0].r=1;
    		    for(i=1;i<325;i++)
    		    {
    		        p[i].l=i-1;
    		        p[i].r=i+1;
    		        p[i].sum=0;
    		        p[i].u=p[i].d=i;
 
    		    }
    		    p[324].r=0;
    		    cnt=325;
    		    for(i=0;i<9;i++)
    		    {
    		        for(j=0;j<9;j++)
    		        {
    		            if(map[i][j]!='?')
    		            {
 
    		                delnode(i * 9 + j + 1);
    		                int tx = map[i][j] - '1';
    		                delnode(81 + (i + 1) + 9 * tx);
    		                delnode(162 + (j + 1) + 9 * tx);
    		                delnode(243 + (i / 3 * 3+ j / 3 + 1)+ 9 * tx );
    		            }else
    		            {
    		                nn='1';
    		                x=i;
    		                y=j;
    		                for(k=0;k<9;k++,nn++)
    		                {
    		                    if (row[i][k]||col[j][k]||cube[i / 3 * 3 + j / 3][k])
    		                        continue;
    		                    int cnum = cnt;
    		                    addnode(i * 9 + j + 1);
    		                    addnode(81 + (i + 1) + 9 * k);
    		                    addnode(162 + (j + 1) + 9 * k);
    		                    addnode(243 + (i / 3 * 3+ j / 3 + 1)+9 * k );
    		                    p[cnum].l = cnt - 1;
    		                    p[cnt - 1].r = cnum;
 
    		                }
    		            }
 
    		        }
    		    }
    		    dfs(0);
 
    }
	void addnode(int fa){
		p[cnt].x=x;
	    p[cnt].y=y;
	    p[cnt].f=fa;
	    p[cnt].now=nn;
	    p[cnt].u=p[fa].u;
	    p[cnt].d=fa;
	    p[fa].sum++;
	    p[p[fa].u].d=cnt;
	    p[fa].u=cnt;
	    p[cnt].l=cnt-1;
	    p[cnt].r=cnt+1;
	    cnt++;
	    return ; 
	}
	void delnode(int c)
	{
	    p[p[c].l].r=p[c].r;
	    p[p[c].r].l=p[c].l;
	}
 
 
	void remove(int c)
	{
 
	    p[p[c].l].r=p[c].r;
	    p[p[c].r].l=p[c].l;
	    int i,j;
	    for(i=p[c].d;i!=c;i=p[i].d)
	    {
	        for(j=p[i].r;j!=i;j=p[j].r)
	        {
 
	            p[p[j].f].sum--;
	            p[p[j].u].d=p[j].d;
	            p[p[j].d].u=p[j].u;
 
	        }
	    }
 
	}
	void resume(int c)
	{
 
	    int i,j;
	    for(i=p[c].u;i!=c;i=p[i].u)
	    {
	        for(j=p[i].l;j!=i;j=p[j].l)
	        {
	            p[p[j].f].sum++;
	            p[p[j].u].d=j;
	            p[p[j].d].u=j;
 
	        }
	    }
	    p[p[c].r].l=c;
	    p[p[c].l].r=c;
	}
	boolean dfs(int k)
	{
 
	    int i,j,minx=p[0].r;
	    if(p[0].r==0)
	    {
 
	        for(i=0;i<9;i++)
	        {
	            for(j=0;j<9;j++)
	            {
	                if(j!=0)
	                System.out.print(" "+map[i][j]);
	                else
	                	 System.out.print(map[i][j]);
	            }
	         System.out.println();
	        }
	        return true;
	    }
	    for(i=p[0].r;i!=0;i=p[i].r)
	    {
 
	        if(p[i].sum<p[minx].sum)
	            minx=i;
	    }
	    remove(minx);
	    for(i=p[minx].d;i!=minx;i=p[i].d)
	    {
	        map[p[i].x][p[i].y]=p[i].now;
	        for(j=p[i].r;j!=i;j=p[j].r)
	        {
 
	            remove(p[j].f);
	        }
	        if(dfs(k+1))
	        {
	            return true;
	        }
	        for(j=p[i].l;j!=i;j=p[j].l)
	        {
	            resume(p[j].f);
	        }
	    }
	    resume(minx);
	    return false;
 
	}
 
 
 
 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: candance16.6是一款免费的音乐编辑软件,可以帮助用户编辑、裁剪、合并、转换音频文件格式等。该软件具有简单易用的界面和操作,同时提供多种音频编辑工具,可以满足用户各种音乐处理需求。 candance16.6的官方网站提供了该软件的下载地址,用户只需在官网上下载并安装即可开始使用。安装过程非常简单,无需任何高级知识。安装完成后,用户可以根据需要使用软件的不同功能进行编辑,例如裁剪、调整音量、调整声音平衡等等。 总的来说,candance16.6是一款功能齐全、简单易用的音乐编辑软件。如果您需要编辑音频文件,不妨尝试使用一下,相信会给您带来不少方便。 ### 回答2: candance16.6是一个舞蹈类软件,主要提供舞蹈动作教学以及音乐节奏配合的锻炼方式,旨在让用户享受舞蹈带来的身心愉悦和健康提升。用户可以通过该软件学习多种舞蹈类型,如拉丁舞、爵士舞、街舞等,并可以自由选择不同难度等级的教学视频进行跟随练习。此外,candance16.6还提供音乐播放及调节功能,用户可以根据自己的喜好选择不同的音乐风格,或是根据自己的身体状态调整音乐的速度和强度,以达到更好的锻炼效果。同时,该软件还支持社交分享功能,用户可以将自己在舞蹈练习中的成果分享给朋友圈、社交媒体等,展示自己的运动魅力和舞蹈技巧。总之,candance16.6是一款非常适合舞蹈和健身爱好者的软件,无论是初学者还是高级玩家都能从中找到自己的乐趣和收获。 ### 回答3: Candance16.6是一款用于舞蹈编排的软件,是Candance软件系列的其中一款。用户可通过其在计算机上进行舞蹈编排和排练,同时也能预览不同角度的舞蹈演示效果。Candance16.6支持各种不同舞蹈类型,如现代舞、芭蕾舞、拉丁舞和爵士舞等,同时也支持各种舞蹈曲风和节奏。 Candance16.6具有可视化的编辑工具,使得用户可以非常轻松地进行编排和舞蹈设计。它还可以生成音乐的波形图,用户可以根据波形图调整自己的舞蹈动作和步伐。 Candance16.6的功能非常强大,不仅可满足舞蹈编排的需求,也能在比赛和演出中提供支持,帮助用户更好地表现自己的舞姿和舞蹈技巧。值得注意的是,Candance16.6是付费软件,需要购买授权才能使用。 总之,Candance16.6是一个非常实用和强大的舞蹈编排软件,帮助用户轻松地进行舞蹈设计和排练,提高舞蹈表现能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值