#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); } } }