Fire Net

AC_sskiller.發表於2020-11-14

dfs

題目大意

現在有一個N*N的地圖,地圖上有一些圍牆。你的任務是在沒有圍牆的空白地方建儘可能多的炮臺。

假設炮臺可以向“上下左右”四個方向發射子彈,子彈可以穿越任何距離並可在途中摧毀一個另一個炮臺。而牆壁結構堅固,可以阻止子彈。

現在你的目標是儘可能多地在地圖中設定炮臺,並且保證炮臺不會互相摧毀。

題目思路

對於每一個點遍歷,如果可以放置就作一個標記,如果不能放置就繼續遍歷下一個點。直到所有與點都被遍歷。

#include<stdio.h>
int n,i,j,ans;
char s[5][5];
 
int c_put(int n,int m)
{
    for(i=n-1;i>=0;i--)
    {
        if(s[i][m]=='O')
            return 0;
        if(s[i][m]=='X')
            break;
    }
    for(j=m-1;j>=0;j--)
    {
        if(s[n][j]=='O')
            return 0;
        if(s[n][j]=='X')
            break;
    }
    return 1;
}
 
void dfs(int k,int num)
{
    int x,y;
    if(k==n*n)
    {
        if(num>ans)
            ans=num;
        return ;
    }
    else
    {
        x=k/n;
        y=k%n;
        if(s[x][y]=='.'&&c_put(x,y))
        {
            s[x][y]='O';
            dfs(k+1,num+1);
            s[x][y]='.';
        }
        dfs(k+1,num);
    }
}
int main()
{
    while(~scanf("%d",&n)&&n)
    {
        ans=0;
        for(i=0;i<n;i++)
        {
            getchar();
            for(j=0;j<n;j++)
                scanf("%c",&s[i][j]);
        }
 
        dfs(0,0);
        printf("%d\n",ans);
    }
}

相關文章