习题8-5(uva-177)

#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;
}

猜你喜欢

转载自blog.csdn.net/seanbill/article/details/116773250