刚开始是听说这题是贪心题, 我贪了一会儿也没贪出来一个因为所以。
发现搜索可以就用深搜打一遍,深搜里面的i,j 因为是全局变量,,我错的一脸懵逼,改了好大一会才发现,,,,
下面是搜索代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
char map[5][5];
int v[5][5],n,maxx,i,j;
bool judge(int x,int y){
for(int xx=x;xx<=n;xx++){
if(map[xx][y]=='X') break;
if(v[xx][y]) return false;
}for(int xx=x;xx>0;xx--){
if(map[xx][y]=='X') break;
if(v[xx][y]) return false;
}for(int yy=y;yy<=n;yy++){
if(map[x][yy]=='X') break;
if(v[x][yy]) return false;
}for(int yy=y;yy>0;yy--){
if(map[x][yy]=='X') break;
if(v[x][yy]) return false;
}
return true;
}
void dfs(int s){if(s>maxx) maxx=s;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!v[i][j]&&map[i][j]!='X'&&judge(i,j)){//printf("%d\n",judge());
v[i][j]=1;
dfs(s+1);
v[i][j]=0;//for(int q=1;q<=n;q++){for(int w=1;w<=n;w++) printf("%d ",v[q][w]);printf("\n");}printf("\n");
//printf("%d %d %d\n",v[i][j],i,j);
}
}
}
}
int main(){
while(~scanf("%d",&n)&&n){
maxx=0;
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=n;j++){
scanf("%c",&map[i][j]);
v[i][j]=0;
}
}
dfs(0);
printf("%d\n",maxx);
}
return 0;
}
A后,百度了一下别人怎么贪得,,,发现我之前的思路大致是对了,要是反复再推敲推敲可能就过了,,
下面是别人的贪心代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int q[9][9]; //保存可影响的格子数
char map[9][9];
int main()
{
int m,n,i,j,k,s;
while(cin>>n&&n)
{
s=0;
memset(q,0,sizeof(q));
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
cin>>map[i][j];
}
for(i=1; i<=n; i++) //将每个非墙位置初始化
for(j=1; j<=n; j++)
{
if(map[i][j]=='.')
{
q[i][j]++;
for(k=i-1; k>=1&&map[k][j]=='.'; k--)
q[k][j]++;
for(k=i+1; k<=n&&map[k][j]=='.'; k++)
q[k][j]++;
for(k=j-1; k>=1&&map[i][k]=='.'; k--)
q[i][k]++;
for(k=1+j; k<=n&&map[i][k]=='.'; k++)
q[i][k]++;
}
}
int min1;
int x,y;
for(i=1; i<=n; i++)
{
min1=8;
for(j=1; j<=n; j++)
{
if(map[i][j]=='.'&&q[i][j]<min1) //每次都选这行影响格子数最小的地方建立炮台
{
min1=q[i][j];
x=i;
y=j;
}
}
if(min1!=8) //受影响地方标记
{
s++;
for(k=x-1; k>=1&&map[k][y]=='.'; k--)
q[k][y]=8;
for(k=x+1; k<=n&&map[k][y]=='.'; k++)
q[k][y]=8;
for(k=y-1; k>=1&&map[x][k]=='.'; k--)
q[x][k]=8;
for(k=1+y; k<=n&&map[x][k]=='.'; k++)
q[x][k]=8;
q[x][y]=8;
i--; //防漏
}
}
cout<<s<<endl;
}
return 0;
}