题目链接Don’t Get Rooked
题意:
给一个最多4 × 4的棋盘,每放置一个点,与这个点同行同列就不能再放点
除非两个点在墙的两侧,问给定规模的棋盘最多能放多少个点
思路:
数据少,直接暴力dfs
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
char chess[5][5];
bool vis[5][5];
int ans,n;
bool judge(int x,int y)
{
if(vis[x][y]||chess[x][y] == 'X'){
return false;
}
//上
for(int i = x - 1; i >= 0; i--){
if(chess[i][y] == 'X'){
break;
}
if(vis[i][y]){
return false;
}
}
//下
for(int i = x + 1; i < n; i++){
if(chess[i][y] == 'X'){
break;
}
if(vis[i][y]){
return false;
}
}
//左
for(int i = y - 1; i >= 0; i--){
if(chess[x][i] == 'X'){
break;
}
if(vis[x][i]){
return false;
}
}
//右
for(int i = y + 1; i < n; i++){
if(chess[x][i] == 'X'){
break;
}
if(vis[x][i]){
return false;
}
}
return true;
}
void dfs(int tem)
{
ans = max(ans,tem);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(judge(i,j)){
vis[i][j] = true;
dfs(tem + 1);
vis[i][j] = false;
}
}
}
}
int main()
{
while(cin>>n&&n){
for(int i = 0; i < n; i++){
cin>>chess[i];
}
ans = 0;
memset(vis,false,sizeof(vis));
dfs(0);
cout<<ans<<endl;
}
return 0;
}