zoukankan      html  css  js  c++  java
  • 算法作业三

    #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);
            }
        }
    }
  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/qlky/p/6015814.html
Copyright © 2011-2022 走看看