⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queen2.java

📁 八皇后问题是一个古老而闻名的问题
💻 JAVA
字号:
//8 Queen 递归算法
//如果有一个Q 为 chess[i]=j;
//则不安全的地方是 k行  j位置,j+k-i位置,j-k+i位置
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.net.*;
public class Queen2{

  //定义皇后的个数QueenMax,算法的种类oktiemes
  static final int QueenMax = 8;
  static int oktimes = 0;
  static int chess[] = new int[QueenMax];//每一个Queen的放置位置
  public static String []rows=new String[92];//保存算法的字符串

  public static void main(String args[])
  {
    for (int i=0;i<QueenMax;i++)
    	chess[i]=-1;                    
    placequeen(0);
    QueenTu queen=new QueenTu();
    System.out.println("\n八皇后共有"+oktimes+"个解法.   作者:孟雪锋、张锐  版本:1.0");
  }


/*
 *@功能就是获得每一种方法的字符串,保存在rows数组中,用的是递归方法
 */
  public static void placequeen(int num)
  { //num 为现在要放置的行数
    int i=0;
    boolean qsave[] = new boolean[QueenMax];
    for(;i<QueenMax;i++) 
    	qsave[i]=true;
    i=0;
    //下面先把安全位数组完成
    //i 是现在要检查的数组值
    while (i<num)
    {
      qsave[chess[i]]=false;
      int k=num-i;
      if ( (chess[i]+k >= 0) && (chess[i]+k < QueenMax) ) 
      	qsave[chess[i]+k]=false;
      if ( (chess[i]-k >= 0) && (chess[i]-k < QueenMax) ) 
      	qsave[chess[i]-k]=false;
      i++;
    }
    //下面历遍安全位
    for(i=0;i<QueenMax;i++)
    {
      if (qsave[i]==false)
      	continue;
      if (num<QueenMax-1)
      {
        chess[num]=i;
        placequeen(num+1);
      }
      else
      { //num is last one
      	chess[num]=i;
      	oktimes++;
        //System.out.println("这是第"+oktimes+"个解法 如下:");
      	//System.out.println("第n行:  1 2 3 4 5 6 7 8");		
        String row="";
      	for (i=0;i<QueenMax;i++)
      	{
       		
       		if (chess[i]==0);
       		else 
        	for(int j=0;j<chess[i];j++) row+="-";
        	row+="+";
        	int j = chess[i];
        	while(j<QueenMax-1)
        	{
        		row+="-";
        		j++;
        	}
       		rows[oktimes-1]=row;

        }
        
      }
    }
  //历遍完成就停止
  }
}

     //用swing组件显示 	
     class QueenTu extends JFrame 
     {
     	JLabel lab1=new JLabel("第1种解法");
     	JPanel pan1=new JPanel();
     	JPanel pan2=new JPanel();
     	JPanel pan3=new JPanel();
     	JButton but1=new JButton("显示");
		JButton but2=new JButton("清除");
		
		URL url1=QueenTu.class.getResource("imag1.jpg");
		URL url2=QueenTu.class.getResource("imag2.jpg");
		Icon icon1=new ImageIcon(url1);
		Icon icon2=new ImageIcon(url2);
		int size=Queen2.QueenMax*Queen2.QueenMax;
		public JLabel[] lab=new JLabel[size];
		int i=0;
		QueenTu()
		{
			super("八皇后");
			addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e)
						{System.exit(0);}});
			initialize();
    	}
    	public void initialize()
    	{
			
			pan1.setLayout(new GridLayout(Queen2.QueenMax,Queen2.QueenMax,2,2));

			pan1.setSize(27*Queen2.QueenMax,86*Queen2.QueenMax);
			pan2.setSize(50,50);
			lab1.setForeground(Color.red);
			
			
			for(int j=0;j<size;j++)
			{
				String str;
				str=(Queen2.rows[0].substring(j,j+1)).trim();
				if(str.equals("+"))
					lab[j]=new JLabel(icon2);
				else
				    lab[j]=new JLabel(icon1);
			}
			i++;
            but1.addActionListener(new Listener());
            but2.addActionListener(new Listener());
			for(int i=0;i<size;i++)
			pan1.add(lab[i]);
			pan2.add(but1);
			pan2.add(but2);
			pan3.add(lab1);
			getContentPane().add(pan3,BorderLayout.NORTH);
			getContentPane().add(pan1,BorderLayout.CENTER);
			getContentPane().add(pan2,BorderLayout.SOUTH);
			setLocation(300,0);
			setSize(27*Queen2.QueenMax+50,86*Queen2.QueenMax+50);
			pan1.setBackground(Color.ORANGE);
			pan2.setBackground(Color.YELLOW);
			pan3.setBackground(Color.green);
			setBackground(Color.MAGENTA);
			setVisible(true);
		}
       
 class Listener  implements ActionListener
 {
        public void actionPerformed(ActionEvent e)
        {
        		
        	if(e.getSource()==but1)
        		
        	if(i<Queen2.oktimes)
        	{
        		for(int j=0;j<size;j++)
			    {
			        String str;
					str=(Queen2.rows[i].substring(j,j+1)).trim();
						
					if(str.equals("+"))
						lab[j].setIcon(icon2);
					else
				    	lab[j].setIcon(icon1);
				    lab1.setText("第"+(i+1)+"种解法");
				}
				i++;
        	}
        	else
        	{
        		i=0;
        		for(int j=0;j<size;j++)
			    {
			        String str;
					str=(Queen2.rows[i].substring(j,j+1)).trim();
						
					if(str.equals("+"))
						lab[j].setIcon(icon2);
					else
				    	lab[j].setIcon(icon1);
				    lab1.setText("第"+(i+1)+"种解法");
				}
				i++;
        	}
        	if(e.getSource()==but2)
        	{
        		for(int j=0;j<size;j++)
        		{
        			lab[j].setIcon(icon1);
        		}
        		i=0;
        		lab1.setText("清除");
        	}
        		
       	}
 }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -