【瞎搞】 HDU 1986 Encoding

给出一个n*m 的框框   

然后给你一串字符   由 空格和A-Z  组成 

分别表示  0 - 26 的5位 二进制

比如   空格 -  0  -    00000

      A      -  1  -    00001

。。。。。。。。

 然后把这一串字符翻译成二进制串  然后蛇字放进框框里

然后横着输出

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#define cler(arr, val)    memset(arr, val, sizeof(arr))
#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define IN   freopen ("in.txt" , "r" , stdin);
#define OUT  freopen ("out.txt" , "w" , stdout);
typedef long long  LL;
const int MAXN = 5010;
const int MAXM = 6000010;
const int INF = 0x3f3f3f3f;
const int mod = 1000003;
const double eps= 1e-8;
#define lson l,m, rt<<1
#define rson m+1,r,rt<<1|1
string mp;
char s[55005];
string x[27];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
#endif
    for(int i=0; i<=26; i++)
    {
        stack<int>st;
        int c=i;
        for(int j=0; j<5; j++)
        {
            int m=c%2;
            c/=2;
            st.push('0'+m);
        }
        while(!st.empty())
        {
            x[i]+=st.top();
            st.pop();
        }
    }
    //for(int i=0;i<=26;i++) cout<<x[i]<<endl;
    char s[5555];
    int t,n,m,cas=1;
    scanf("%d",&t);
    while(t--)
    {
        mp.clear();
        scanf("%d %d%*c",&n,&m);
        gets(s);
        int len=strlen(s);
        for(int i=0; i<len; i++)
        {
            int num;
            if(s[i]==' ')
                num=0;
            else num=s[i]-'A'+1;
            mp+=x[num];
        }
       // printf("%d\n",mp.length());
        while(mp.length()!=n*m)
            mp+='0';
        int vis[22][22];
        char num[22][22];
        for(int i=0; i<=n+1; i++)
            for(int j=0; j<=m+1; j++) vis[i][j]=1;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++) vis[i][j]=0;
        int step=0,x=1,y=1,fx=0;
        vis[x][y]=1;
        while(1)
        {
                num[x][y]=mp[step];
            if(step==n*m-1) break;
         //   printf("%d %d\n",x,y);
            if(fx==0)
            {
                if(vis[x][y+1])
                {
                    fx=1;
                    continue;
                }
                y++;
                vis[x][y]=1;
            }
            else if(fx==1)
            {

                if(vis[x+1][y])
                {
                    fx=2;
                    continue;
                }
                x++;
                vis[x][y]=1;
            }
            else if(fx==2)
            {

                if(vis[x][y-1])
                {
                    fx=3;
                    continue;
                }
                y--;
                vis[x][y]=1;
            }
            else if(fx==3)
            {
                if(vis[x-1][y])
                {
                    fx=0;
                    continue;
                }
                x--;
                vis[x][y]=1;
            }
            step++;
        }
        printf("%d ",cas++);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++) printf("%c",num[i][j]);
        puts("");
    }
    return 0;
}


posted @ 2014-10-30 20:15  kewowlo  阅读(122)  评论(0编辑  收藏  举报