#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int maxn = 1e4 + 7,maxm = 400, sDir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
enum Dir { Dleft = 0, Dright = 1, Dup = 2, Ddown = 3 };
char ans[maxn << 1] = {Dright,Dup }, matrix[maxm][maxm];
int GetOppsite(int d) {
if (d == Dleft) return Dright;
if (d == Dright) return Dleft;
if (d == Dup) return Ddown;
return Dup;
}
void ChangeValue(int& a, int val, int& tmin, int& tmax) {
a += val;
tmin = min(tmin, a);
tmax = max(tmax, a);
}
int main()
{
int n = 2,cnt;
for (int i = 1; i <= 13; i++) {
int m = n >> 1;
char* cur = ans + n ,*last = ans ;
for (int j = 0; j < m; j++)
*cur++ = GetOppsite(*last++);
for(int j = 0;j<m;j++)
*cur++ = *last++;
n <<= 1;
}
while (cin >> cnt && cnt) {
n = 1 << cnt;
int x = 0, y = 0, minx = 0, miny = 0, maxx = 0, maxy = 0;
for (int j = 0; j < n; j++) {
if (j && (ans[j] == Dleft || ans[j] == Dright)) ChangeValue(x, sDir[ans[j]][0], minx, maxx);
else if ((ans[j] == Ddown)) ChangeValue(y, sDir[ans[j]][1], miny, maxy);
ChangeValue(x, sDir[ans[j]][0], minx, maxx);
if(ans[j] != Ddown) ChangeValue(y, sDir[ans[j]][1], miny, maxy);;
}
x = -minx;
y = -miny;
memset(matrix, ' ', sizeof(matrix));
for (int j = 0; j < n; j++) {
if (j && (ans[j] == Dleft || ans[j] == Dright)) x += sDir[ans[j]][0];
else if ((ans[j] == Ddown))y += sDir[ans[j]][1];
if (ans[j] == Dleft || ans[j] == Dright) matrix[y][x] = '_';
else matrix[y][x] = '|';
x += sDir[ans[j]][0];
if (ans[j] != Ddown) y += sDir[ans[j]][1];
}
n = maxy - miny + 1;
int index = maxx - 2 * minx + 1;
while (index > 0 && matrix[0][index - 1] == ' ')index--;
matrix[0][index] = '\0';
if (index != 0) cout << matrix[0] << endl;
for (int i = 1; i < n; i++) {
index = maxx - 2 * minx + 1;
while (index > 0 && matrix[i][index - 1] == ' ')index--;
matrix[i][index] = '\0';
cout << matrix[i] << endl;
}
cout << "^" << endl;
}
return 0;
}
习题8-5(uva-177)
最新推荐文章于 2021-07-01 11:56:40 发布