Uva 804 Spatial Structures

链接

题意

给一张图的两种表示方法,让你互相转化。然后输出,题意太长,就不翻译了。

解题思路

图转树: 利用递归的写法很容易想出递归的方案,就是先递归整张地图,可以将左上角加长度的一半作为参数递归。这样可以在递归的时候将整张图分成四块分别递归。当然我的实现方法有点冗余,没有用数据结构优化。
树转图:这个比较容易写,只要将给的数字从十进制转化为5进制,一直递归然后到最后当数为0的时候就到了叶子节点,也就是可以画图的时候了。
槽点:这题的输出格式比较是最后一个测试例后面就不用换行, 还有看lrj紫书中说数据都是2的整数次幂,但是注意1也是2的整数幂(/≧▽≦)/。
直接上代码,不过真的冗余,写完我自己都惊呆了 0.0

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <math.h>
#include <queue>
#include <string>
#include <sstream>
#include <vector>
#include <string.h>

using namespace std;

const int maxn = 70;
const int INF = 111;
string s[maxn];
int n;
int cnt = 0;
vector<int> ans;
void init()
{
    for (int i = 0; i < maxn; i++)
        s[i].resize(maxn);
    for (int i = 0; i < maxn; i++)
        for (int j = 0; j < maxn; j++)
            s[i][j] = '.';
    ans.clear();
    cnt = 0;
}
//sx sy 递归区域的左上角座标 , len: 递归区域的边长的一半(正方形)
void buildTree(int sx, int sy, int len, int val, int base)
{
    bool flag = false;
    bool flag1 = false;
    for (int i = sx; i < sx + len*2; i++)
        for (int j = sy; j < sy + len*2; j++)
        {
            if (s[j][i] == '1')
            {
                flag = true;
            }
            if (s[j][i] == '0')
                flag1 = true;
        }
    if (flag && !flag1)
    {
        ans.push_back(val);
        cnt++;
        return;
    }else if(!flag && flag1)
    {
        return;
    }
    flag = false;
    flag1 = false;
    for (int i = sx; i < sx + len; i++)//左上角 sx, sy
        for (int j = sy; j < sy + len; j++)
        {
            if (s[j][i] == '1')
            {
                flag = true;
            }
            if (s[j][i] == '0')
                flag1 = true;
        }
    if (flag)
    {
        if(flag1)
            buildTree(sx, sy, len / 2, val + 1*base, base*5);
        else ans.push_back(val + 1 * base),cnt++;
    }
    flag = false;
    flag1 = false;
    for (int i = sx + len; i < sx + len * 2; i++)//二号位置 sx+len,sy
        for (int j = sy; j < sy + len; j++)
        {
            if (s[j][i] == '1')
            {
                flag = true;
            }
            if (s[j][i] == '0')
                flag1 = true;
        }
    if (flag)
    {
        if (flag1)
            buildTree(sx + len, sy, len / 2, val + base * 2, base * 5);
        else ans.push_back(val + base * 2),cnt++;
    }
    flag = false;
    flag1 = false;
    for (int i = sx; i < sx + len; i++)//三号位置 sx, sy+len
        for (int j = sy + len; j < sy + len * 2; j++)
        {
            if (s[j][i] == '1')
            {
                flag = true;
            }
            if (s[j][i] == '0')
                flag1 = true;
        }
    if (flag)
    {
        if (flag1)
            buildTree(sx, sy + len, len / 2, val + base * 3, base * 5);
        else ans.push_back(val + base * 3),cnt++;
    }
    flag = false;
    flag1 = false;
    for (int i = sx + len; i < sx + len * 2; i++)//四号位置 sx + len, sy+len
        for (int j = sy + len; j < sy + len * 2; j++)
        {
            if (s[j][i] == '1')
            {
                flag = true;
            }
            if (s[j][i] == '0')
                flag1 = true;
        }
    if (flag)
    {
        if (flag1)
            buildTree(sx + len, sy + len, len / 2, val + base * 4, base * 5);
        else ans.push_back(val + base * 4),cnt++;
    }
}

void draw(int num, int sx, int sy, int len)
{
    int dir = num % 5;
    if (dir == 0)
    {
        for (int i = sy; i < sy + len*2; i++)
            for (int j = sx; j < sx + len*2; j++)
                s[i][j] = '*';
        return;
    }
    if (dir == 1)
    {
        if (num / 5 == 0)
        {
            for (int i = sy; i < sy + len; i++)
                for (int j = sx; j < sx + len; j++)
                    s[i][j] = '*';
        }
        else draw(num/5,sx, sy, len/2);
    }
    if (dir == 2)
    {
        if (num / 5 == 0)
        {
            for (int i = sy; i < sy + len; i++)
                for (int j = sx + len; j < sx + len * 2; j++)
                    s[i][j] = '*';
        }
        else draw(num / 5, sx+len, sy, len / 2);
    }
    if (dir == 3)
    {
        if (num / 5 == 0)
        {
            for (int i = sy + len; i < sy + len * 2; i++)
                for (int j = sx; j < sx + len; j++)
                    s[i][j] = '*';
        }
        else draw(num / 5, sx, sy+len, len / 2);
    }
    if (dir == 4)
    {
        if (num / 5 == 0)
        {
            for (int i = sy+len; i < sy + len*2; i++)
                for (int j = sx+len; j < sx + len*2; j++)
                    s[i][j] = '*';
        }
        else draw(num / 5, sx+len, sy+len, len / 2);
    }
}

void getMp( int n)
{
    int num;
    while (cin >> num && num != -1)
    {
        draw(num, 0, 0, n/2);
    }
}

int main()
{
    //freopen("cin.txt", "r", stdin);
    //freopen("cout.txt", "w", stdout);
    int T = 1;
    while (cin >> n && n != 0)
    {
        if(T != 1)
        cout << endl;
        init();
        if (n > 0)
        {
            for (int i = 0; i < n; i++)
            {
                cin >> s[i];
            }
            buildTree(0, 0, (n+1)/2, 0,1);
            sort(ans.begin(), ans.end());
            cout << "Image " << T << endl;
            if (!ans.empty())
            {
                cout << ans[0];
                for (int i = 1; i < ans.size(); i++)
                {
                    if (i % 12 == 0)
                        cout << ans[i];
                    else 
                    cout << " " << ans[i];
                    if ((i + 1) % 12 == 0 && i + 1 < ans.size())
                        cout << endl;
                }
                cout << endl;
            }
            cout << "Total number of black nodes = " << cnt << endl;
        }
        else {
            n = -n;
            getMp( n+1);
            cout << "Image " << T << endl;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                    cout << s[i][j];
                cout << endl;
            }
        }
        T++;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章