• 算法作业三


    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <sys/time.h>
    #include <windows.h>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define LL long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define MAXN 100010
    
    bool vis[3][20];
    
    int mp[10][10];
    
    void init()
    {
        mem(vis,false);
        mem(mp,0);
    }
    
    bool check(int a,int b)
    {
        if(!vis[0][a] && !vis[1][a-b+8] && !vis[2][a+b])
        {
            vis[0][a]=vis[1][a-b+8]=vis[2][a+b]=true;
            return true;
        }
        else return false;
    }
    
    void get()
    {
        for(int i =0;i<8;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            mp[a][b] = 1;
            if(check(a,b)) printf("OK
    ");
            else printf("WRONG
    ");
        }
    }
    
    void show()
    {
        for(int i =1;i<=8;i++)
        {
            for(int j = 1;j<=8;j++)
            {
                printf("%d	",mp[i][j]);
            }
            printf("
    ");
        }
    }
    
    int main()
    {
        int i,j,k,T;
        scanf("%d",&T);
        while(T--)
        {
            init();
            get();
            show();
        }
    
        return 0;
    }
    
    /*
    3
    1 4 2 7 3 3 4 8 5 2 6 5 7 1 8 6
    1 5 2 2 3 4 4 7 5 3 6 8 7 6 8 1
    1 4 2 2 3 7 4 3 5 6 6 8 7 5 8 1
    */
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <time.h>
    #include <windows.h>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define LL long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define MAXN 100010
    
    bool vis[5][20];
    
    int mp[10][10],ans;
    
    void init()
    {
        mem(vis,false);
        mem(mp,0);
        ans=0;
    }
    
    bool check(int a,int b)
    {
        if(!vis[3][a] && !vis[0][b] && !vis[1][b-a+8] && !vis[2][a+b])
        {
            vis[3][a]=vis[0][b]=vis[1][a-b+8]=vis[2][a+b]=true;
            return true;
        }
        return false;
    }
    
    void show()
    {
        for(int i =1;i<=8;i++)
        {
            for(int j = 1;j<=8;j++)
            {
                printf("%d	",mp[i][j]);
            }
            printf("
    ");
        }
        printf("
    ");
    }
    
    void dfs(int x)
    {
        if(x>8) 
        {
            show();
            ans++;
            return;
        }
        int i;
        for(i=1;i<=8;i++)
        {
            if(!vis[0][i] && !vis[1][x-i+8] && !vis[2][x+i])
            {
                vis[0][i]=vis[1][x-i+8]=vis[2][x+i]=true;
                mp[x][i] = 1;
                dfs(x+1);
                vis[0][i]=vis[1][x-i+8]=vis[2][x+i]=false;
                mp[x][i] = 0;
            }
        }
    }
    
    void get()
    {
        for(int i =0;i<8;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            mp[a][b] = 1;
            show();
            if(check(a,b))
            {
                printf("OK
    ");
            }
            else
            {
                printf("WRONG
    ");
                break;
            }
        }
    }
    
    
    int main()
    {
        int i,j,k,T;
    
        printf("输入1为测试,2为遍历
    ");
        scanf("%d",&k);
        
        init();
    
        if(k==1)
        {
            printf("请输入棋子的坐标
    ");
            get();
        }
        else
        {
            dfs(1);
            printf("总共有%d个解法
    ",ans);
        }
    
        return 0;
    }
    
    /*
    1 4 
    2 7 
    3 3 
    4 8 
    5 2 
    6 5 
    7 1 
    8 6
    */
    /*
    1 5
    2 2 
    3 4 
    4 7 
    5 3 
    6 8 
    7 6 
    8 1
    */
    /*
    1 4 
    2 2 
    3 7 
    4 3 
    5 6 
    6 8 
    7 5 
    8 1
    */
    package java_test;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class Queen 
    {
        public static int num = 0;
        private show show = null;
    
        
        //vis[0]保存主对角线状态,vis[1]保存副对角线状态,vis[2]保存每列状态
        //因为是从上到下顺序执行,所以行状态不用保存,用pos保存位置即可
        public void Queen(int queenNum) 
        {
            int pos[] = new int[queenNum];
            boolean vis[][] = new boolean[5][20];
            for(int i =0;i<5;i++)
            {
                for(int j=0;j<20;j++) vis[i][j] = false;
            }
            dfs(0, queenNum, pos,vis);
        }
    
        private void dfs(int row, int queenNum, int pos[], boolean vis[][]) 
        {
            if (row == queenNum) //到了最后一行则打印
            {
                num++;
                printQueen(pos);
                return;
            }
            
            for (int col = 0; col < queenNum; col++) 
            {
                if (!vis[0][col] && !vis[1][row-col+8] && !vis[2][row+col])
                {
                    pos[row] = col;
                    vis[0][col]=vis[1][row-col+8]=vis[2][row+col]=true;
                    if (show != null) show.showQueen(pos, row);
                    dfs(row + 1, queenNum, pos,vis);
                    vis[0][col]=vis[1][row-col+8]=vis[2][row+col]=false;
                    pos[row] = col;
                }
            }
        }
    
        private boolean check(int a,int b,boolean vis[][])
        {
            if(!vis[0][a] && !vis[1][b-a+8] && !vis[2][b+a])
            {
                vis[0][a]=vis[1][b-a+8]=vis[2][b+a]=true;
                return true;
            }
            return false;
        }
    
        /**
         * 打印棋盘
         */
        private void printQueen(int[] status) {
            int n = status.length;
            StringBuilder queenString = new StringBuilder();
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    queenString.append((j == status[i]) ? '*' : '-');
                    queenString.append((j == (n - 1)) ? "
    " : "   ");
                }
            }
    
            System.out.println("第" + num + "种解决方案:");
            System.out.println(queenString);
        }
    
        public void setshow(show show) {
            this.show = show;
        }
    
        public static void main(String[] args) {
            show shower = new show();
            shower.setDelay(10); // 设置动画暂停时间
            shower.setDelayOfEnd(30);
    
            // 设置显示窗口
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 500);
            frame.setLocationRelativeTo(null);
            frame.getContentPane().add(shower);
            frame.setVisible(true);
    
            // 创建EightQueen
            Queen queen = new Queen();
            queen.setshow(shower);
            int queenNumber = 8;//皇后数量
            queen.Queen(queenNumber);
            System.out.println("总共有" + num + "种解决方案,呵呵,效果还不错吧O(∩_∩)O");
        }
    }
    
    /**
     * 用来显示皇后状态的Panel
     */
    class show extends JPanel {
        private int   currentRow = 0; // 当前是第几行
        private int[] status     = null; // 皇后状态数组
        private int   delay      = 100; // 动画暂停时间
        private int   delayOfEnd = 5000; // 找到解决方暂停的时间,停久点可以方便看到解决方案
    
        public show() {
        }
    
        public int getDelay() {
            return delay;
        }
    
        public void setDelay(int delay) {
            this.delay = delay;
        }
    
        public int getDelayOfEnd() {
            return delayOfEnd;
        }
    
        public void setDelayOfEnd(int delayOfEnd) {
            this.delayOfEnd = delayOfEnd;
        }
    
        public void showQueen(int[] status, int currentRow) {
            this.status = status;
            this.currentRow = currentRow;
            this.repaint();
    
            try {
                // 找到解决方案的时候,多停一会
                Thread.sleep((currentRow == status.length - 1) ? delayOfEnd : delay);
            } catch (InterruptedException e) {
            }
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); // 使用Swing自带的双缓冲清除上一帧的痕迹
    
            if (status == null) { return; }
    
            int x = 0, y = 0;
            int offsetX = 2, offsetY = 2; // gaps between the frame
            Dimension size = getSize();
            int cellWidth = (size.width - offsetX - offsetX) / status.length;
            int cellHeight = (size.height - offsetY - offsetY) / status.length;
    
            // Draw row grid lines
            int width = status.length * cellWidth;
            for (int i = 0; i <= status.length; ++i) {
                g.drawLine(0 + offsetX, y + offsetY, width + offsetX, y + offsetY);
                y += cellHeight;
            }
    
            // Draw column grid lines
            int height = status.length * cellHeight;
            for (int i = 0; i <= status.length; ++i) {
                g.drawLine(x + offsetX, offsetY, x + offsetX, height + offsetY);
                x += cellWidth;
            }
    
            // Draw queens
            for (int i = 0; i <= currentRow; ++i) {
                x = status[i] * cellWidth;
                y = i * cellHeight;
    
                g.fillRect(x + offsetX, y + offsetY, cellWidth, cellHeight);
            }
        }
    }
  • 相关阅读:
    Android插件化技术简介
    Fragment回退栈&commit()和commitAllowingStateLoss()
    Android热更新技术——Tinker、nuwa、AndFix、Dexposed
    Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock
    synchronized与Lock的区别与使用
    多分类Logistics回归公式的梯度上升推导&极大似然证明sigmoid函数的由来
    从损失函数的角度详解常见机器学习算法
    LR的损失函数&为何使用-log损失函数而非平方损失函数
    css Cascading Style Sheet 层叠样式表
    前端—— 前端介绍开始(二)
  • 原文地址:https://www.cnblogs.com/qlky/p/6015814.html
Copyright © 2020-2023  润新知