简单回溯,但对我来说不算很简单,毕竟我的搜索底子很浅,还好这道做的还不错,调了一小会,发现是到边界的时候没return,加上之后就过了。
思路很简单,只要把所有的情况都找出来加以判断就行了,dfs实现
//============================================================================
// Name : 639.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <cstdio>
using namespace std;
char s[10][10];
int a[10][10];
int n, Max;
int judge(){
int t;
for(int i = 0;i < n;i++){
t = 0;
for(int j = 0;j < n;j++){
if(a[i][j] == -1){
t = 0;
}
else if(a[i][j] == 1){
t++;
}
if(t > 1) return 0;
}
t = 0;
for(int j = 0;j < n;j++){
if(a[j][i] == -1){
t = 0;
}
else if(a[j][i] == 1){
t++;
}
if(t > 1) return 0;
}
}
return 1;
}
int NUM(){
int t = 0;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(a[i][j] == 1) t++;
}
}
return t;
}
void dfs(int i, int j){
if(i == n){
if(judge() == 1){
if(Max < NUM()){
Max = NUM();
}
}
return;
}
if(s[i][j] == 'X'){
a[i][j] = -1;
if(j == n-1) dfs(i+1, 0);
else dfs(i, j+1);
}
else{
a[i][j] = 0;
if(j == n-1) dfs(i+1, 0);
else dfs(i, j+1);
a[i][j] = 1;
if(j == n-1) dfs(i+1, 0);
else dfs(i, j+1);
}
}
int main() {
freopen("a.txt", "r", stdin);
while(scanf("%d", &n)&&n){
Max = 0;
for(int i = 0;i < n;i++){
scanf("%s", s[i]);
}
dfs(0,0);
printf("%d\n", Max);
}
return 0;
}
399

被折叠的 条评论
为什么被折叠?



