您的位置:首页 > 其它

Bzoj1501: [NOI2005]智慧珠游戏

2018-02-27 20:59 225 查看

题面

Bzoj

我写这篇题解的原因

证明我是一个有耐心的人

Sol

爆搜

先判断有没有小于三的联通块

然后ACAC

其实不用像我这样打的

主要是打了一半时发现可以打个表循环找,然而打了一半,所以就只写了20k20k(逃

其实也就写了不到一个小时

其实也就调了几分钟

。。。

。。。

。。。

我代码又臭又长被关了起来

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;

IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}

int vis[50][50], G = 10, use[20];

IL void Out(){
for(RG int i = 1; i <= 10; ++i, puts(""))
for(RG int j = 1; j <= i; ++j)
printf("%c", vis[i + G][j + G] + 'A' - 1);
exit(0);
}

IL bool Check(RG int x, RG int y, RG int tp, RG int r){
x += G, y += G;
if(tp == 1){
if(use[1]) return 1;
if(r == 1) return vis[x][y] + vis[x + 1][y] + vis[x][y + 1];
if(r == 2) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y + 1];
if(r == 3) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1];
if(r == 4) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1];
}
if(tp == 2){
if(use[2]) return 1;
if(r == 1) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x][y + 3];
if(r == 2) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 3][y];
}
if(tp == 3){
if(use[3]) return 1;
if(r == 1) return vis[x][y] + vis[x + 1][y] + vis[x][y + 1] + vis[x][y + 2];
if(r == 2) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x + 1][y + 2];
if(r == 3) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y + 1];
if(r == 4) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y - 1];
if(r == 5) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1] + vis[x + 1][y + 2];
if(r == 6) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 1][y - 2];
if(r == 7) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y] + vis[x + 2][y];
if(r == 8) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x + 2][y + 1];
}
if(tp == 4){
if(use[4]) return 1;
return vis[x][y] + vis[x + 1][y] + vis[x][y + 1] + vis[x + 1][y + 1];
}
if(tp == 5){
if(use[5]) return 1;
if(r == 1) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y + 1] + vis[x + 2][y + 2];
if(r == 2) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y - 1] + vis[x + 2][y - 2];
if(r == 3) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x + 1][y] + vis[x + 2][y];
if(r == 4) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x + 1][y + 2] + vis[x + 2][y + 2];
}
if(tp == 6){
if(use[6]) return 1;
if(r == 1) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x][y + 2] + vis[x][y + 3];
if(r == 2) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x + 1][y + 2] + vis[x][y + 3];
if(r == 3) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 1][y + 1] + vis[x + 1][y + 2];
if(r == 4) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 1][y - 2] + vis[x + 1][y + 1];
if(r == 5) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1] + vis[x + 2][y] + vis[x + 3][y];
if(r == 6) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 2][y] + vis[x + 3][y];
if(r == 7) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y + 1] + vis[x + 3][y];
if(r == 8) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y - 1] + vis[x + 3][y];
}
if(tp == 7){
if(use[7]) return 1;
if(r == 1) return vis[x][y] + vis[x + 1][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x + 1][y + 2];
if(r == 2) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1] + vis[x + 1][y + 2] + vis[x][y + 2];
if(r == 3) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y + 1];
if(r == 4) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x + 2][y + 1] + vis[x + 2][y];
}
if(tp == 8){
if(use[8]) return 1;
if(r == 1) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1] + vis[x][y + 1] + vis[x][y + 2];
if(r == 2) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x + 1][y + 1] + vis[x + 1][y + 2];
if(r == 3) return vis[x][y] + vis[x + 1][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x + 1][y + 2];
if(r == 4) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 1][y + 1] + vis[x][y + 1];
if(r == 5) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 1][y + 1] + vis[x + 2][y + 1];
if(r == 6) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 1][y - 1] + vis[x + 2][y - 1];
if(r == 7) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x][y + 1] + vis[x + 1][y + 1];
if(r == 8) return vis[x][y] + vis[x + 1][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x + 2][y + 1];
}
if(tp == 9){
if(use[9]) return 1;
if(r == 1) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x + 1][y + 2] + vis[x + 1][y + 3];
if(r == 2) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x][y + 1] + vis[x][y + 2];
if(r == 3) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 1][y - 2];
if(r == 4) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x + 1][y + 2] + vis[x + 1][y + 3];
if(r == 5) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y + 1] + vis[x + 3][y + 1];
if(r == 6) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 2][y - 1] + vis[x + 3][y - 1];
if(r == 7) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 2][y - 1] + vis[x + 3][y - 1];
if(r == 8) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1] + vis[x + 2][y + 1] + vis[x + 3][y + 1];
}
if(tp == 10){
if(use[10]) return 1;
return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 1][y + 1] + vis[x + 2][y];
}
if(tp == 11){
if(use[11]) return 1;
if(r == 1) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1] + vis[x + 2][y + 1] + vis[x + 2][y + 2];
if(r == 2) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 2][y - 1] + vis[x + 2][y - 2];
if(r == 3) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 2][y - 1];
if(r == 4) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x + 1][y + 2] + vis[x + 2][y + 2];
}
if(tp == 12){
if(use[12]) return 1;
if(r == 1) return vis[x][y] + vis[x + 1][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x][y + 3];
if(r == 2) return vis[x][y] + vis[x][y + 1] + vis[x][y + 2] + vis[x][y + 3] + vis[x + 1][y + 3];
if(r == 3) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y + 1] + vis[x + 1][y + 2] + vis[x + 1][y + 3];
if(r == 4) return vis[x][y] + vis[x + 1][y] + vis[x + 1][y - 1] + vis[x + 1][y - 2] + vis[x + 1][y - 3];
if(r == 5) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 3][y];
if(r == 6) return vis[x][y] + vis[x][y + 1] + vis[x + 1][y + 1] + vis[x + 1][y + 2] + vis[x + 1][y + 3];
if(r == 7) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 3][y] + vis[x + 3][y + 1];
if(r == 8) return vis[x][y] + vis[x + 1][y] + vis[x + 2][y] + vis[x + 3][y] + vis[x + 3][y - 1];
}
}

IL void Dfs(RG int xx, RG int yy){
if(yy > xx) xx++, yy = 1;
if(xx > 10) Out();
if(vis[xx + G][yy + G]){
Dfs(xx, yy + 1);
return;
}
RG int x = xx + G, y = yy + G;
if(!Check(xx, yy, 1, 1)){
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = 1;
use[1] = 1;
Dfs(xx, yy + 1);
use[1] = 0;
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = 0;
}
if(!Check(xx, yy, 1, 2)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = 1;
use[1] = 1;
Dfs(xx, yy + 1);
use[1] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = 0;
}
if(!Check(xx, yy, 1, 3)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = 1;
use[1] = 1;
Dfs(xx, yy + 1);
use[1] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = 0;
}
if(!Check(xx, yy, 1, 4)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = 1;
use[1] = 1;
Dfs(xx, yy + 1);
use[1] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = 0;
}
if(!Check(xx, yy, 2, 1)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x][y + 3] = 2;
use[2] = 1;
Dfs(xx, yy + 1);
use[2] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x][y + 3] = 0;
}
if(!Check(xx, yy, 2, 2)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = 2;
use[2] = 1;
Dfs(xx, yy + 1);
use[2] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = 0;
}
if(!Check(xx, yy, 3, 1)){
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x][y + 2] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x][y + 2] = 0;
}
if(!Check(xx, yy, 3, 2)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = 0;
}
if(!Check(xx, yy, 3, 3)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = 0;
}
if(!Check(xx, yy, 3, 4)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = 0;
}
if(!Check(xx, yy, 3, 5)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 0;
}
if(!Check(xx, yy, 3, 6)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = 0;
}
if(!Check(xx, yy, 3, 7)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 2][y] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 2][y] = 0;
}
if(!Check(xx, yy, 3, 8)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = 3;
use[3] = 1;
Dfs(xx, yy + 1);
use[3] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = 0;
}
if(!Check(xx, yy, 4, 1)){
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x + 1][y + 1] = 4;
use[4] = 1;
Dfs(xx, yy + 1);
use[4] = 0;
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x + 1][y + 1] = 0;
}
if(!Check(xx, yy, 5, 1)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = vis[x + 2][y + 2] = 5;
use[5] = 1;
Dfs(xx, yy + 1);
use[5] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = vis[x + 2][y + 2] = 0;
}
if(!Check(xx, yy, 5, 2)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = vis[x + 2][y - 2] = 5;
use[5] = 1;
Dfs(xx, yy + 1);
use[5] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = vis[x + 2][y - 2] = 0;
}
if(!Check(xx, yy, 5, 3)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y] = vis[x + 2][y] = 5;
use[5] = 1;
Dfs(xx, yy + 1);
use[5] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y] = vis[x + 2][y] = 0;
}
if(!Check(xx, yy, 5, 4)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = vis[x + 2][y + 2] = 5;
use[5] = 1;
Dfs(xx, yy + 1);
use[5] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = vis[x + 2][y + 2] = 0;
}
if(!Check(xx, yy, 6, 1)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x][y + 2] = vis[x][y + 3] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x][y + 2] = vis[x][y + 3] = 0;
}
if(!Check(xx, yy, 6, 2)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = vis[x][y + 3] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = vis[x][y + 3] = 0;
}
if(!Check(xx, yy, 6, 3)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 0;
}
if(!Check(xx, yy, 6, 4)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = vis[x + 1][y + 1] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = vis[x + 1][y + 1] = 0;
}
if(!Check(xx, yy, 6, 5)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 2][y] = vis[x + 3][y] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 2][y] = vis[x + 3][y] = 0;
}
if(!Check(xx, yy, 6, 6)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y] = vis[x + 3][y] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y] = vis[x + 3][y] = 0;
}
if(!Check(xx, yy, 6, 7)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = vis[x + 3][y] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = vis[x + 3][y] = 0;
}
if(!Check(xx, yy, 6, 8)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = vis[x + 3][y] = 6;
use[6] = 1;
Dfs(xx, yy + 1);
use[6] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = vis[x + 3][y] = 0;
}
if(!Check(xx, yy, 7, 1)){
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = 7;
use[7] = 1;
Dfs(xx, yy + 1);
use[7] = 0;
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = 0;
}
if(!Check(xx, yy, 7, 2)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x][y + 2] = 7;
use[7] = 1;
Dfs(xx, yy + 1);
use[7] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x][y + 2] = 0;
}
if(!Check(xx, yy, 7, 3)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = 7;
use[7] = 1;
Dfs(xx, yy + 1);
use[7] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = 0;
}
if(!Check(xx, yy, 7, 4)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = vis[x + 2][y] = 7;
use[7] = 1;
Dfs(xx, yy + 1);
use[7] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = vis[x + 2][y] = 0;
}
if(!Check(xx, yy, 8, 1)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x][y + 1] = vis[x][y + 2] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x][y + 1] = vis[x][y + 2] = 0;
}
if(!Check(xx, yy, 8, 2)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 0;
}
if(!Check(xx, yy, 8, 3)){
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = 0;
}
if(!Check(xx, yy, 8, 4)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y + 1] = vis[x][y + 1] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y + 1] = vis[x][y + 1] = 0;
}
if(!Check(xx, yy, 8, 5)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = 0;
}
if(!Check(xx, yy, 8, 6)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = 0;
}
if(!Check(xx, yy, 8, 7)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x][y + 1] = vis[x + 1][y + 1] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x][y + 1] = vis[x + 1][y + 1] = 0;
}
if(!Check(xx, yy, 8, 8)){
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = 8;
use[8] = 1;
Dfs(xx, yy + 1);
use[8] = 0;
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = 0;
}
if(!Check(xx, yy, 9, 1)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 0;
}
if(!Check(xx, yy, 9, 2)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x][y + 1] = vis[x][y + 2] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x][y + 1] = vis[x][y + 2] = 0;
}
if(!Check(xx, yy, 9, 3)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = 0;
}
if(!Check(xx, yy, 9, 4)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 0;
}
if(!Check(xx, yy, 9, 5)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = vis[x + 3][y + 1] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y + 1] = vis[x + 3][y + 1] = 0;
}
if(!Check(xx, yy, 9, 6)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = vis[x + 3][y - 1] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 2][y - 1] = vis[x + 3][y - 1] = 0;
}
if(!Check(xx, yy, 9, 7)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = vis[x + 3][y - 1] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = vis[x + 3][y - 1] = 0;
}
if(!Check(xx, yy, 9, 8)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = vis[x + 3][y + 1] = 9;
use[9] = 1;
Dfs(xx, yy + 1);
use[9] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = vis[x + 3][y + 1] = 0;
}
if(!Check(xx, yy, 10, 1)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y + 1] = vis[x + 2][y] = 10;
use[10] = 1;
Dfs(xx, yy + 1);
use[10] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y + 1] = vis[x + 2][y] = 0;
}
if(!Check(xx, yy, 11, 1)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = vis[x + 2][y + 2] = 11;
use[11] = 1;
Dfs(xx, yy + 1);
use[11] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 2][y + 1] = vis[x + 2][y + 2] = 0;
}
if(!Check(xx, yy, 11, 2)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = vis[x + 2][y - 2] = 11;
use[11] = 1;
Dfs(xx, yy + 1);
use[11] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = vis[x + 2][y - 2] = 0;
}
if(!Check(xx, yy, 11, 3)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = 11;
use[11] = 1;
Dfs(xx, yy + 1);
use[11] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 2][y - 1] = 0;
}
if(!Check(xx, yy, 11, 4)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 2][y + 2] = 11;
use[11] = 1;
Dfs(xx, yy + 1);
use[11] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 2][y + 2] = 0;
}
if(!Check(xx, yy, 12, 1)){
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x][y + 3] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x + 1][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x][y + 3] = 0;
}
if(!Check(xx, yy, 12, 2)){
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x][y + 3] = vis[x + 1][y + 3] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x][y + 1] = vis[x][y + 2] = vis[x][y + 3] = vis[x + 1][y + 3] = 0;
}
if(!Check(xx, yy, 12, 3)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 0;
}
if(!Check(xx, yy, 12, 4)){
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = vis[x + 1][y - 3] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 1][y - 1] = vis[x + 1][y - 2] = vis[x + 1][y - 3] = 0;
}
if(!Check(xx, yy, 12, 5)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = 0;
}
if(!Check(xx, yy, 12, 6)){
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x][y + 1] = vis[x + 1][y + 1] = vis[x + 1][y + 2] = vis[x + 1][y + 3] = 0;
}
if(!Check(xx, yy, 12, 7)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = vis[x + 3][y + 1] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = vis[x + 3][y + 1] = 0;
}
if(!Check(xx, yy, 12, 8)){
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = vis[x + 3][y - 1] = 12;
use[12] = 1;
Dfs(xx, yy + 1);
use[12] = 0;
vis[x][y] = vis[x + 1][y] = vis[x + 2][y] = vis[x + 3][y] = vis[x + 3][y - 1] = 0;
}
}

int in[30][30];

IL int Size(RG int x, RG int y){
if(vis[x + G][y + G] || in[x][y]) return 0;
RG int ret = 1;
in[x][y] = 1;
ret += Size(x + 1, y);
ret += Size(x - 1, y);
ret += Size(x, y - 1);
ret += Size(x, y + 1);
return ret;
}

int main(RG int argc, RG char* argv[]){
Fill(vis, 1);
for(RG int i = 1; i <= 10; ++i)
for(RG int j = 1; j <= i; ++j){
RG char c; scanf(" %c", &c);
if(c == '.') vis[i + G][j + G] = 0;
else vis[i + G][j + G] = c - 'A' + 1, use[c - 'A' + 1] = 1;
}
for(RG int i = 1; i <= 10; ++i)
for(RG int j = 1; j <= i; ++j)
if(!vis[i + G][j + G] && !in[i][j] && Size(i, j) < 3) return puts("No solution"), 0;
Dfs(1, 1), puts("No solution");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: