hdu 1045 Fire Net

来源:互联网 发布:linux 自动脚本 编辑:程序博客网 时间:2024/05/31 18:37

刚开始是听说这题是贪心题, 我贪了一会儿也没贪出来一个因为所以。

发现搜索可以就用深搜打一遍,深搜里面的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;}



0 0
原创粉丝点击