📄 1002.cpp
字号:
//要 注意不同的炮塔可能在同一个点产生叠加 所以不能直接副直
#include<iostream>
using namespace std;
int line;
char square[5][5];
char s[5][5];
int maxnum=0;
void copy(char ss[][5],char l[][5])
{
int i,j;
for(i=1;i<5;i++)
for(j=1;j<5;j++)
l[i][j]=ss[i][j];
}
void put(int r,int l)
{
int i;
s[r][l]=1;
for(i=r-1;i>0;i--)
{
if(s[i][l]=='X')
break;
s[i][l]+=2;
}
for(i=r+1;i<=line;i++)
{
if(s[i][l]=='X')
break;
s[i][l]+=2;
}
for(i=l-1;i>0;i--)
{
if(s[r][i]=='X')
break;
s[r][i]+=2;
}
for(i=l+1;i<=line;i++)
{
if(s[r][i]=='X')
break;
s[r][i]+=2;
}
}
void re(int r,int l)
{
int i;
s[r][l]='.';
for(i=r-1;i>0;i--)
{
if(s[i][l]==2)
s[i][l]='.';
else if(s[i][l]=='X')
break;
else
s[i][l]-=2;
}
for(i=r+1;i<=line;i++)
{
if(s[i][l]==2)
s[i][l]='.';
else if(s[i][l]=='X')
break;
else
s[i][l]-=2;
}
for(i=l-1;i>0;i--)
{
if(s[r][i]==2)
s[i][l]='.';
else if(s[r][i]=='X')
break;
else
s[r][i]-=2;
}
for(i=l+1;i<=line;i++)
{
if(s[r][i]==2)
s[i][l]='.';
else if(s[r][i]=='X')
break;
else
s[r][i]-=2;
}
}
void cal(int row,int li,int sum)
{
if(row>line)
{
if(sum>maxnum)
{
maxnum=sum;
}
}
else
{
if(s[row][li]=='.')
{
put(row,li);
if(li==line)
cal(row+1,1,sum+1);
else
cal(row,li+1,sum+1);
re(row,li);
}
if(li==line)
cal(row+1,1,sum);
else
cal(row,li+1,sum);
}
}
int main()
{
int n;
int i,j,k;
cin>>line;
while(line!=0)
{
for(i=1;i<=line;i++)
{
for(j=1;j<=line;j++)
cin>>square[i][j];
}
copy(square,s);
cal(1,1,0);
cout<<maxnum<<endl;
maxnum=0;
memset(square,0,sizeof(square));
cin>>line;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -