这道题目就是一个利用深度优先搜索的例子
#include <iostream>
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;
}
本文介绍了一个使用深度优先搜索算法解决的问题实例。该程序通过递归地检查棋盘上可以放置‘t’的位置来找到最优解,展示了如何避免冲突并记录最大可能的数量。
5138

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



