UVALive 7269 Snake Carpet

5 5 5 3 3
5 4 4 3 2 
5 4 4 1 2

5 5 5 3 3 6 6
5 4 4 3 2 6 6 
5 4 4 1 2 6 6

5 5 5 3 3 6 6
5 4 4 3 2 6 6
5 4 4 1 2 7 6
7 7 7 7 7 7 6

剩下自己领悟规律
#include <bits/stdc++.h>
using namespace std;
const int N = 520;
int a[N][N];
int row, col;
void get(int m){
	if(m == 1){
		puts("1 1");
		puts("1 1");
	}
	else if(m == 2) {
		puts("1 3");
		puts("1 1\n1 2 1 3");
	}
	else if(m == 3){
		puts("2 3");
		puts("1 2");
		puts("1 3 2 3");
		puts("1 1 2 1 2 2");
	}else if(m == 4){
		puts("2 5\n1 4\n1 5 2 5\n1 1 2 1 2 2\n1 2 1 3 2 3 2 4") ;
	}else if(m == 5){	
		puts("3 5\n3 4\n1 4 1 5\n2 4 2 5 3 5\n2 2 2 3 3 3 3 2\n3 1 2 1 1 1 1 2 1 3");
	}
}
bool cmp1(pair<int, int> a, pair<int, int> b) {
	if(a.second != b.second) return a.second < b.second;
	if(a.second % 2 == 0){
		return a.first > b.first;
	}else{
		return a.first < b.first;
	}
}
bool cmp2(pair<int, int> a, pair<int, int> b) {
	if(a.first != b.first) return a.first > b.first;
	return a.second < b.second;
}
int main(){
	int n;
	a[1][1] = 3; a[2][1] = 3; a[1][2] = 3;
	a[3][1] = 1;
	a[2][2] = a[3][2] = 2;
	a[1][3] = a[1][4] = a[2][3] = a[2][4] = 4;
	a[3][3] = a[3][4] = a[3][5] = a[2][5] = a[1][5] = 5;
	while(cin >> n){
		a[1][1] = 3; a[2][1] = 3; a[1][2] = 3;
		a[3][1] = 1;
		a[2][2] = a[3][2] = 2;
		a[1][3] = a[1][4] = a[2][3] = a[2][4] = 4;
		a[3][3] = a[3][4] = a[3][5] = a[2][5] = a[1][5] = 5;
		if(n < 6) get(n);
		else
		{
			row = 3, col = 5;
			for(int i = 6; i <= n; i++){
				if(i %2 == 0){
					
					for(int j = 1; j <= row; j++){
						a[j][col+1] = a[j][col+2] = i;
					}
					col += 2;
				}
				else{
					for(int j = 1; j <= col; j++) a[row+1][j] = i;
					row++;
					swap(a[row-1][col-1], a[row][col]);
				}
			}
			vector<pair<int, int> > ans[550];
			for(int i = 1; i <= row; i++){
				for(int j = 1; j <= col; j++) {
					ans[a[i][j]].push_back(make_pair(i, j));
				}
			}
			printf("%d %d\n", row, col);
			puts("3 4\n1 4 1 5\n2 4 2 5 3 5\n2 2 2 3 3 3 3 2\n3 1 2 1 1 1 1 2 1 3");
			for(int i = 6; i <= n; i++) {
				if(i%2 == 0){
					sort(ans[i].begin(), ans[i].end(), cmp1);
				}else{
					sort(ans[i].begin(), ans[i].end(), cmp2);
				}
			}
			for(int i = 6; i <= n; i++) {
				for(int j = 0; j < ans[i].size(); j++) {
					printf("%d %d ", ans[i][j].first, ans[i][j].second);
				}
				puts("");
			}
		}
		
		
		
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值