PKU 1128 Frame Stacking 解题

这个题目就是一个模拟的过程
每次找到一个完整的矩形然后把这个矩形拿出。拿走的地方全部变成*
*号是可以表示为任何字母
然后哦一次下去就可以了。
优于把题目读错了结果一直就在wa
先开始把题目读成了每个矩形左上角的点和右下角的点必定会出现
结果题目的意思是出现的所有点中最靠左的x和最靠上的y组成的就是左上角
同样最靠右的最靠下的组成的就是又下角的坐标。

  1#include<stdio.h>
  2#include<iostream>
  3#include<string.h>
  4#include<string>
  5using namespace std;
  6struct C{int x,y,a,b;};
  7char data[50][50],use[30],p[30];
  8C a[30];
  9string q[100],temp;
 10int l,ans,n,m;
 11void di(int k)
 12{
 13        //printf("%d\n",k);
 14    int i,f,j;
 15    int map[50][50];
 16    if(k==l)
 17    {
 18        q[ans++]=p;
 19        return;
 20    }

 21    for(j=25;j>=0;j--)
 22    {
 23        if(use[j]||a[j].a==-1)continue;
 24        f=1;
 25        for(i=a[j].x;i<=a[j].a;i++)if((data[i][a[j].y]!=j+'A'&& data[i][a[j].y]!='*'){f=0;break;}
 26        if(f==0)continue;
 27        for(i=a[j].x;i<=a[j].a;i++)if((data[i][a[j].b]!=j+'A'&& data[i][a[j].b]!='*'){f=0;break;}
 28        if(f==0)continue;
 29        for(i=a[j].y;i<=a[j].b;i++)if((data[a[j].x][i]!=j+'A'&& data[a[j].x][i]!='*'){f=0;break;}
 30        if(f==0)continue;
 31        for(i=a[j].y;i<=a[j].b;i++)if((data[a[j].a][i]!=j+'A'&& data[a[j].a][i]!='*'){f=0;break;}
 32        //printf("");for(i=a[j].y;i<=a[j].b;i++)printf("%c",data[a[j].a][i]);printf("\n");
 33        if(f==0)continue;
 34        //printf("%d\n",j);
 35            for(i=a[j].x;i<=a[j].a;i++)
 36            {
 37                map[i][a[j].y]=data[i][a[j].y];
 38                map[i][a[j].b]=data[i][a[j].b];
 39            }

 40            for(i=a[j].y;i<=a[j].b;i++)
 41            {
 42                map[a[j].x][i]=data[a[j].x][i];
 43                map[a[j].a][i]=data[a[j].a][i];
 44            }

 45
 46            for(i=a[j].x;i<=a[j].a;i++)
 47            {
 48                data[i][a[j].y]='*';
 49                data[i][a[j].b]='*';
 50            }

 51            for(i=a[j].y;i<=a[j].b;i++)
 52            {
 53                data[a[j].x][i]='*';
 54                data[a[j].a][i]='*';
 55            }

 56
 57            use[j]=1;
 58            p[l-k-1]=j+'A';
 59            di(k+1);
 60            //printf("%d\n",j);
 61            use[j]=0;
 62            for(i=a[j].x;i<=a[j].a;i++)
 63            {
 64                data[i][a[j].y]=map[i][a[j].y];
 65                data[i][a[j].b]=map[i][a[j].b];
 66            }

 67            for(i=a[j].y;i<=a[j].b;i++)
 68            {
 69                data[a[j].x][i]=map[a[j].x][i];
 70                data[a[j].a][i]=map[a[j].a][i];
 71            }

 72    }

 73
 74}

 75int main()
 76{
 77    //freopen("input.txt","r",stdin);
 78    int i,j;
 79    char ch;
 80    while(scanf("%d%d",&n,&m)!=EOF)
 81    {
 82        scanf("%c",&ch);
 83        memset(data,0,sizeof(data));
 84        memset(use,0,sizeof(use));
 85        memset(a,-1,sizeof(a));
 86        l=0;ans=0;
 87        for(i=0;i<n;i++)
 88        {
 89            for(j=0;j<m;j++)
 90            {
 91                scanf("%c",&data[i][j]);
 92                if(data[i][j]!='.')
 93                {
 94                    
 95                    if(a[data[i][j]-'A'].x==-1)l++;
 96                    if(a[data[i][j]-'A'].x==-1||a[data[i][j]-'A'].x>i)a[data[i][j]-'A'].x=i;
 97                    if(a[data[i][j]-'A'].y==-1||a[data[i][j]-'A'].y>j)a[data[i][j]-'A'].y=j;
 98                    if(a[data[i][j]-'A'].a==-1||a[data[i][j]-'A'].a<i)a[data[i][j]-'A'].a=i;
 99                    if(a[data[i][j]-'A'].b==-1||a[data[i][j]-'A'].b<j)a[data[i][j]-'A'].b=j;
100                }

101            }

102            scanf("%c",&ch);
103        }

104        //for(i=0;i<l;i++)printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].a,a[i].b);
105    /*
106        for(i=0;i<n;i++)
107        {
108            for(j=0;j<n;j++)printf("%c",data[i][j]);
109            printf("\n");
110        }
111    */

112        p[l]=0;ans=0;
113        di(0);
114        for(i=0;i<ans;i++)
115            for(j=0;j<ans-1;j++)
116                if(q[j]>q[j+1])
117                {
118                    temp=q[j];
119                    q[j]=q[j+1];
120                    q[j+1]=temp;
121                }

122        for(i=0;i<ans;i++)cout<<q[i]<<endl;
123    
124
125    //    printf("%d\n",ans);
126    }

127    return 0;
128}

129

posted on 2008-07-19 19:20 gong 阅读(1142) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(6)

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜