此题对我来说意义重大,第一次独立想出问题的解法,第一次 一次AC。
此题用了深度优先搜索的思路,且较简单,适合新手练习。
//number 2.
#include<iostream>
using namespace std;
char map[4][4];
void dfs(int length,int &a) //a用来保存城堡的数量
{
int counts=0;
for(int i=0;i<length;i++)
{
for(int j=0;j<length;j++)
{
if(map[i][j]=='.')
{
int mark=0; //mark是一个标记 如果最后没有变成1 则可以在此处放一个城堡
for(int q=j;q>=0&&map[i][q]!='X';q--) //left
{
if(map[i][q]=='c')mark=1;
}
for(int q=j;q<length&&map[i][q]!='X';q++)//right
{
if(map[i][q]=='c')mark=1;
}
for(int q=i;q>=0&&map[q][j]!='X';q--)//up
{
if(map[q][j]=='c')mark=1;
}
for(int q=i;q<length&&map[q][j]!='X';q++)//down
{
if(map[q][j]=='c')mark=1;
}
if(!mark)
{
map[i][j]='c';
using namespace std;
char map[4][4];
void dfs(int length,int &a) //a用来保存城堡的数量
{
int counts=0;
for(int i=0;i<length;i++)
{
for(int j=0;j<length;j++)
{
if(map[i][j]=='.')
{
int mark=0; //mark是一个标记 如果最后没有变成1 则可以在此处放一个城堡
for(int q=j;q>=0&&map[i][q]!='X';q--) //left
{
if(map[i][q]=='c')mark=1;
}
for(int q=j;q<length&&map[i][q]!='X';q++)//right
{
if(map[i][q]=='c')mark=1;
}
for(int q=i;q>=0&&map[q][j]!='X';q--)//up
{
if(map[q][j]=='c')mark=1;
}
for(int q=i;q<length&&map[q][j]!='X';q++)//down
{
if(map[q][j]=='c')mark=1;
}
if(!mark)
{
map[i][j]='c';
counts=0;
for(int i2=0;i2<length;i2++) //注意:在(i,j)可以安放城堡后立马计算城堡的总个数
{
for(int j2=0;j2<length;j2++)
{
if(map[i2][j2]=='c')counts++;
}
}
if(counts>a)a=counts;
dfs(length,a); //深度游戏搜索中最关键的递归
map[i][j]='.';
}
}
}
}
}
int main()
{
int i;
while(cin>>i)
{
int m=0;
if(!i)break;
for(int j=0;j<i;j++)
{
for(int k=0;k<i;k++)
{
cin>>map[j][k];
}
}
dfs(i,m);
cout<<m<<'\n';
}
}
for(int i2=0;i2<length;i2++) //注意:在(i,j)可以安放城堡后立马计算城堡的总个数
{
for(int j2=0;j2<length;j2++)
{
if(map[i2][j2]=='c')counts++;
}
}
if(counts>a)a=counts;
dfs(length,a); //深度游戏搜索中最关键的递归
map[i][j]='.';
}
}
}
}
}
int main()
{
int i;
while(cin>>i)
{
int m=0;
if(!i)break;
for(int j=0;j<i;j++)
{
for(int k=0;k<i;k++)
{
cin>>map[j][k];
}
}
dfs(i,m);
cout<<m<<'\n';
}
}