求助
查看原帖
求助
86971
TRZ_2007楼主2019/10/12 14:19

我太弱了,连深搜都不会了。

#include <bits/stdc++.h>
using namespace std;

const int N = 19;

char Q[N][N];
int Map[N][N];
int flag = 0;

void changex(int x,int y,int color) {
	for(int i=1;i<=8;i++)
		if(i != y && Map[x][i] != -1) Map[x][i] += color;
	return;
}

void changey(int x,int y,int color) {
	for(int i=1;i<=8;i++)
		if(i != x && Map[i][y] != -1) Map[i][y] += color;
	return;
}

void changelu(int x,int y,int color) {
	int ux,uy;
	while(x != 0 && y != 0)
	{
		x--;
		y--;
	}
	ux = x,uy = y;
	while(ux != 9 && uy != 9)
	{
		if(ux != x && uy != y && Map[ux][uy] != -1) Map[ux][uy] += color;
		ux++;
		uy++;
	}
}

void changerd(int x,int y,int color) {
	int ux,uy;
	while(x != 0 && y != 9)
	{
		x--;
		y++;
	}
	ux = x,uy = y;
	while(ux != 9 && uy != 0)
	{
		if(ux != x && uy != y && Map[ux][uy] != -1) Map[ux][uy] += color;
		ux++;
		uy--;
	}
}

void init() {
	for(int i=1;i<=8;i++)
		for(int j=1;j<=8;j++)
			if(Map[i][j] == -1)
			{
				changex(i,j,1);
				changey(i,j,1);
				changelu(i,j,1);
				changerd(i,j,1);
			}
}

void print() {
	for(int i=1;i<=8;i++)
	{
		for(int j=1;j<=8;j++)
		{
			if(Map[i][j] == -1) putchar('Q');
			else putchar('.');
		}
		puts("");
	}
}

void dfs(int step) {
	if(step == 9)
	{
		print();
		flag = 1;
		exit(0);
	}
	for(int i=1;i<=8;i++)
		for(int j=1;j<=8;j++)
		{
			if(Map[i][j] == 0)
			{
				Map[i][j] = -1;
				changex(i,j,1);
				changey(i,j,1);
				changelu(i,j,1);
				changerd(i,j,1);
				dfs(step+1);
				Map[i][j] = 0;
				changex(i,j,-1);
				changey(i,j,-1);
				changelu(i,j,-1);
				changerd(i,j,-1);
			}
		}
}

int main()
{
	for(int i=1;i<=8;i++)
	{
		scanf("%s",Q[i]+1);
		for(int j=1;j<=8;j++)
		{
			if(Q[i][j] == 'Q') Map[i][j] = -1;
			else Map[i][j] = 0;
		}
	}
	init();
/*	for(int i=1;i<=8;i++)
	{
		for(int j=1;j<=8;j++)
			printf("%d",Map[i][j]);
		puts("");
	}*/
	dfs(4);
	if(!flag) puts("No Answer");
}

2019/10/12 14:19
加载中...