HDU 5025 水爆搜

来源:互联网 发布:淘宝美工修图学校 编辑:程序博客网 时间:2024/05/07 09:49

2014 ACM/ICPC Asia Regional Guangzhou Online

水爆搜

N*N矩阵,找最长的一条路径,使‘.’最多,路径可以且最多可以转一次90°。

枚举每个点,枚举8方向连续的‘.’有多少个,再枚举路径方式。


#include "stdio.h"#include "string.h"int main(){    int n,ans,i,j,k;    int sum[9];    char str[101][101];    while (scanf("%d",&n)!=EOF)    {        if (n==0) break;        ans=0;        getchar();        for (i=0;i<n;i++)            gets(str[i]);        for (i=0;i<n;i++)            for (j=0;j<n;j++)            if (str[i][j]=='.')            {                memset(sum,0,sizeof(sum));                for (k=1;k<=n;k++)                {                    if (i-k<0) break;                    if (str[i-k][j]=='.') sum[1]++; else break;                }                for (k=1;k<=n;k++)                {                    if (i-k<0 || j+k>=n) break;                    if (str[i-k][j+k]=='.') sum[2]++; else break;                }                for (k=1;k<=n;k++)                {                    if (j+k>=n) break;                    if (str[i][j+k]=='.') sum[3]++; else break;                }                for (k=1;k<=n;k++)                {                    if (i+k>=n || j+k>=n) break;                    if(str[i+k][j+k]=='.') sum[4]++; else break;                }                for (k=1;k<=n;k++)                {                    if(i+k>=n) break;                    if (str[i+k][j]=='.') sum[5]++; else break;                }                for (k=1;k<=n;k++)                {                    if (i+k>=n || j-k<0) break;                    if (str[i+k][j-k]=='.') sum[6]++; else break;                }                for (k=1;k<=n;k++)                {                    if (j-k<0) break;                    if (str[i][j-k]=='.') sum[7]++; else break;                }                for (k=1;k<=n;k++)                {                    if (i-k<0 || j-k<0) break;                    if (str[i-k][j-k]=='.') sum[8]++; else break;                }                if (sum[1]+sum[3]>ans) ans=sum[1]+sum[3];                if (sum[1]+sum[5]>ans) ans=sum[1]+sum[5];                if (sum[1]+sum[7]>ans) ans=sum[1]+sum[7];                if (sum[2]+sum[4]>ans) ans=sum[2]+sum[4];                if (sum[2]+sum[6]>ans) ans=sum[2]+sum[6];                if (sum[2]+sum[8]>ans) ans=sum[2]+sum[8];                if (sum[3]+sum[5]>ans) ans=sum[3]+sum[5];                if (sum[3]+sum[7]>ans) ans=sum[3]+sum[7];                if (sum[4]+sum[6]>ans) ans=sum[4]+sum[6];                if (sum[4]+sum[8]>ans) ans=sum[4]+sum[8];                if (sum[5]+sum[7]>ans) ans=sum[5]+sum[7];                if (sum[6]+sum[8]>ans) ans=sum[6]+sum[8];            }        ans++;        printf("%d\n",ans);    }    return 0;}


0 0