这道题目就是一个利用深度优先搜索的例子
#include
<
iostream
>
using namespace std;
class CFireNet
... {
char map[4][4]; //最大也就是4×4的数组
int n, maxn; //n表示当前方阵是几乘几的, maxn表示最大解
public:
using namespace std;
class CFireNet
... {
char map[4][4]; //最大也就是4×4的数组
int n, maxn; //n表示当前方阵是几乘几的, maxn表示最大解
public:
//初始化
void setSize(int number)
{
n = number;
maxn = 0;
}
void initData()
...{
for(int i = 0; i < n; ++i)
...{
for(int j = 0; j < n; ++j)
...{
cin>>map[i][j];
}
}
}
bool checkValue(int row, int col)
...{
int i, j;
for(i = row - 1; i >= 0; i--)
...{
if(map[i][col] == 't')
return false;
else if(map[i][col] == 'X')
break;
}
for(j = col - 1; j >= 0; j--)
...{
if(map[row][j] == 't')
return false;
else if(map[row][j] == 'X')
break;
}
return true;
}
void search(int size, int cnt)
...{
int row, col;
if(size == n * n)
...{
if(cnt > maxn)
maxn = cnt;
return;
}
row = size / n;
col = size % n;
if(map[row][col] == '.' && checkValue(row, col))
...{
map[row][col] = 't';
search(size + 1, cnt + 1);
map[row][col] = '.';
}
search(size + 1, cnt);
}
int getMax()
...{
return maxn;
}
} ;
int main()
... {
int n;
CFireNet firenet;
while(cin >> n)
...{
if(n == 0)
break;
firenet.setSize(n);
firenet.initData();
firenet.search(0,0);
cout<<firenet.getMax()<<endl;
}
return 0;
}
void setSize(int number)
{
n = number;
maxn = 0;
}
void initData()
...{
for(int i = 0; i < n; ++i)
...{
for(int j = 0; j < n; ++j)
...{
cin>>map[i][j];
}
}
}
bool checkValue(int row, int col)
...{
int i, j;
for(i = row - 1; i >= 0; i--)
...{
if(map[i][col] == 't')
return false;
else if(map[i][col] == 'X')
break;
}
for(j = col - 1; j >= 0; j--)
...{
if(map[row][j] == 't')
return false;
else if(map[row][j] == 'X')
break;
}
return true;
}
void search(int size, int cnt)
...{
int row, col;
if(size == n * n)
...{
if(cnt > maxn)
maxn = cnt;
return;
}
row = size / n;
col = size % n;
if(map[row][col] == '.' && checkValue(row, col))
...{
map[row][col] = 't';
search(size + 1, cnt + 1);
map[row][col] = '.';
}
search(size + 1, cnt);
}
int getMax()
...{
return maxn;
}
} ;
int main()
... {
int n;
CFireNet firenet;
while(cin >> n)
...{
if(n == 0)
break;
firenet.setSize(n);
firenet.initData();
firenet.search(0,0);
cout<<firenet.getMax()<<endl;
}
return 0;
}