#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\n");
else printf("WRONG\n");
}
}
void show()
{
for(int i =1;i<=8;i++)
{
for(int j = 1;j<=8;j++)
{
printf("%d\t",mp[i][j]);
}
printf("\n");
}
}
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\t",mp[i][j]);
}
printf("\n");
}
printf("\n");
}
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\n");
}
else
{
printf("WRONG\n");
break;
}
}
}
int main()
{
int i,j,k,T;
printf("输入1为测试,2为遍历\n");
scanf("%d",&k);
init();
if(k==1)
{
printf("请输入棋子的坐标\n");
get();
}
else
{
dfs(1);
printf("总共有%d个解法\n",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)) ? "\n" : " ");
}
}
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);
}
}
}