八皇后问题 java代码

具体的结果在tmp.txt文件里面

package test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class EightQueenDemo
{
    private static final int MAX_NUM = 8;
    private static int[][] arr = new int[MAX_NUM][MAX_NUM];
    private static int[] res = new int[MAX_NUM];
    private static int index = 0;

    private static PrintWriter pw = null;

    private static Set<String> resSet = new HashSet<String>();

    /**
     * 在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法
     * 
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException
    {
        // TODO Auto-generated method stub
        initArr();
        initStream();
        show();
        procedure(0);
        closeStream();
        System.out.println("result = "+index);
        System.out.println("check distinct "+(resSet.size()));
    }

    private static void initArr()
    {
        for (int i = 0; i < MAX_NUM; i++)
        {
            for (int j = 0; j < MAX_NUM; j++)
            {
                arr[i][j] = 10 * i + 10 + j + 1;
            }
        }
    }

    private static void initStream() throws IOException
    {
        File file = new File("tmp.txt");
        if (!file.exists())
        {
            file.createNewFile();
        }else
        {
            file.delete();
            file.createNewFile();
        }
        pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file)));
    }

    private static void closeStream()
    {
        if (pw != null)
        {
            pw.flush();
            pw.close();
        }
    }

    private static void show()
    {
        for (int i = 0; i < MAX_NUM; i++)
        {
            for (int j = 0; j < MAX_NUM; j++)
            {
                System.out.print(arr[i][j] + "    ");
            }
            System.out.println();
        }
    }

    private static void show(int[] res)
    {
        System.out.println(Arrays.toString(res));
    }

    private static boolean isSameCol(int res, int obj)
    {
        return (res % 10 == obj % 10) && obj > 0;
    }

    private static boolean isSameLine(int res, int obj)
    {
        return (res / 10 == obj / 10) && obj > 0;
    }

    // private static boolean isBias(int res, int obj) {
    // return ((res % 10 == res / 10) && (obj % 10 == obj / 10) || (res % 10 +
    // res / 10 == MAX_NUM + 1)
    // && (obj % 10 + obj / 10 == MAX_NUM + 1))
    // && obj > 0;
    // }
    private static boolean isBias2(int res, int obj)
    {
        return ((res % 10 - res / 10 == obj % 10 - obj / 10) || (res % 10 + res / 10 == obj % 10 + obj / 10))
                && obj > 0;
    }

    private static boolean isConflict(int res, int obj)
    {
        // boolean flag = isSameLine(res, obj) || isSameCol(res, obj) ||
        // isBias2(res, obj);
        boolean flag = isSameLine(res, obj) || isBias2(res, obj) || isSameCol(res, obj);
        // System.out.println("flag="+flag+"&&res="+res+"||obj="+obj);
        return flag;
    }

    private static void isAccordCond(int arrInt, int line)
    {
        boolean isConflickFlag = false;
        for (int j = 0; j < line; j++)
        {
            if (isConflict(arrInt, res[j]))
            {
                isConflickFlag = true;
                break;
            }
        }
        if (!isConflickFlag)
        {
            res[line] = arrInt;
            if (line == MAX_NUM - 1)
            {
                // show(res);
                String str = Arrays.toString(res);
                // System.out.println(str);
                resSet.add(str);
                draw(res);
                index++;
            } else
            {
                line++;
                procedure(line);
            }

        }

    }

    private static void procedure(int line)
    {
        for (int i = 0; i < MAX_NUM; i++)
        {
            res[line] = 0;
            isAccordCond(arr[line][i], line);
        }
    }

    private static void draw(int[] res)
    {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < MAX_NUM; i++)
        {
            for (int j = 0; j < MAX_NUM; j++)
            {
                if (checkNum(res, arr[i][j]))
                {
                    sb.append(" @");
                } else
                {
                    sb.append(" $");
                }
            }
            pw.println(sb.toString());
            sb.delete(0, sb.length());
        }
        pw.println();
        pw.println("--------------------------------------------------------");
    }

    private static boolean checkNum(int[] res, int obj)
    {
        boolean flag = false;
        for (int i = 0; i < MAX_NUM; i++)
        {
            if (obj == res[i])
            {
                flag = true;
                break;
            }
        }
        return flag;
    }

}
发布了9 篇原创文章 · 获赞 0 · 访问量 7080

猜你喜欢

转载自blog.csdn.net/yangyingjieshiwo/article/details/52002328