657 - The die is cast

来源:互联网 发布:服装et软件cad 编辑:程序博客网 时间:2024/05/21 19:17
描述:这道题就是递归套用递归,用两个递归再加上一个快排就可以了AC了,但是交了一次错误答案,可惜了,就是在第一层递归的时候只要递归*上下前后四个方向就可以了,我递归成八个方向的了,-_-......#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;int count,visit_s[110][110];void dfs_count(int s[110][110],int row,int clow,int visit[110][110]){    if(!visit[row][clow]||s[row][clow]!=2)return;    visit[row][clow]=0;    dfs_count(s,row-1,clow,visit);    dfs_count(s,row,clow-1,visit);    dfs_count(s,row,clow+1,visit);    dfs_count(s,row+1,clow,visit);}void dfs(int s[110][110],int row,int clow,int visit[110][110]){    if(!s[row][clow]||!visit[row-1][clow-1])return;    if(visit_s[row-1][clow-1]==2)    {        count++;        dfs_count(visit,row-1,clow-1,visit_s);    }    visit[row-1][clow-1]=0;    dfs(s,row-1,clow,visit);    dfs(s,row,clow-1,visit);    dfs(s,row,clow+1,visit);    dfs(s,row+1,clow,visit);}int cmp(const void *p1,const void *p2){    return *(int*)p1>*(int*)p2;}int main(){    //freopen("a.txt","r",stdin);    int n,m,i,j,flag,k,sum[110];    int str[110][110],visit_str[110][110];    char c;    k=0;    while(scanf("%d%d",&m,&n)!=EOF)    {        if(!n&&!m)break;        k++;        memset(str,0,sizeof(str));        memset(visit_str,0,sizeof(visit_str));        memset(visit_s,0,sizeof(visit_s));        getchar();        for(i=0; i<n; i++)        {            for(j=0; j<m; j++)            {                scanf("%c",&c);                if(c=='*')visit_str[i][j]=1;                if(c=='X')visit_str[i][j]=visit_s[i][j]=2;                if(c=='*'||c=='X')str[i+1][j+1]=1;            }            getchar();        }        flag=0;        memset(sum,0,sizeof(sum));        for(i=0; i<n; i++)            for(j=0; j<m; j++)                if(visit_str[i][j]>=1&&str[i+1][j+1])                {                    count=0;                    dfs(str,i+1,j+1,visit_str);                    sum[flag++]=count;                }        qsort(sum,flag,sizeof(int),cmp);        printf("Throw %d\n",k);        printf("%d",sum[0]);        for(i=1;i<flag;i++)        printf(" %d",sum[i]);        printf("\n\n");    }    return 0;}

原创粉丝点击