题意
给一张图的两种表示方法,让你互相转化。然后输出,题意太长,就不翻译了。
解题思路
图转树: 利用递归的写法很容易想出递归的方案,就是先递归整张地图,可以将左上角加长度的一半作为参数递归。这样可以在递归的时候将整张图分成四块分别递归。当然我的实现方法有点冗余,没有用数据结构优化。
树转图:这个比较容易写,只要将给的数字从十进制转化为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;
}