ural 1008. Image Encoding bfs

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1008


题意描述:对一幅黑白格图片(例右图)的描述方式有两种(保证黑格边连通,且横竖坐标介于1~10):

1,第一行输出黑格总数N;接下来N行以  外X升序、内Y升序  的顺序输出每个黑格的坐标,图例即:见原网页

6
2 3
2 4
3 3
3 4
4 2
4 3


2.第一行输出首先最左然后最下的黑格坐标;接下来N行按描述顺序输出每个黑格邻接黑格的描述,从左边开始以逆时针的方式遍历邻接黑格,若该黑格未被描述过则输出相应方向标志(Right Top Left Bottom)每行末尾输出一个英文逗号表示结尾,最后一行的逗号替换成英文点号,图例即:

2 3
RT,
RT,
,
B,
,
.


要求给定任意一种描述方式,输出另外一种描述方式;


思路大致就是相互转换吧,BFS + 二维遍历;


AC代码:

//#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;

enum State{ WHITE, BLACK, VISITED };
vector<vector<State> >v(20, vector<State>(20, WHITE));

bool printChar(int x, int y, char c){
	if (v[x][y] == BLACK){
		printf("%c", c);
		v[x][y] = VISITED;
		return true;
	}
	return false;
}

void one(int n){      // 第一种转第二种
	int x, y, a, b;
	scanf("%d%d", &x, &y);
	v[x][y] = BLACK;

	for (int i = 1; i < n; i++){
		scanf("%d%d", &a, &b);
		v[a][b] = BLACK;
	}

	printf("%d %d\n", x, y);
	v[x][y] = VISITED;

	queue<pair<int, int> >q;
	q.push(make_pair(x, y));

	while (!q.empty()){
		x = q.front().first;
		y = q.front().second;
		q.pop();

		if (printChar(x + 1, y, 'R'))q.push(make_pair(x + 1, y));
		if (printChar(x, y + 1, 'T'))q.push(make_pair(x, y + 1));
		if (printChar(x - 1, y, 'L'))q.push(make_pair(x - 1, y));
		if (printChar(x, y - 1, 'B'))q.push(make_pair(x, y - 1));

		if (q.empty())
			printf(".\n");
		else
			printf(",\n");
	}

}

void two(int x, int y){  // 第二种转第一种

	queue<pair<int, int> > q;
	q.push(make_pair(x, y));
	v[x][y] = BLACK;
	char s[5];
	int cnt = 0;

	while (!q.empty()){
		int a = q.front().first;
		int b = q.front().second;
		q.pop(); cnt++;
		scanf("%s", s);
		for (size_t i = 0; i < strlen(s) - 1; i++)
			switch (s[i]){
			case 'R':v[a + 1][b] = BLACK; q.push(make_pair(a + 1, b)); break;
			case 'T':v[a][b + 1] = BLACK; q.push(make_pair(a, b + 1)); break;
			case 'L':v[a - 1][b] = BLACK; q.push(make_pair(a - 1, b)); break;
			case 'B':v[a][b - 1] = BLACK; q.push(make_pair(a, b - 1)); break;
			default:break;
		}
	}

	printf("%d\n", cnt);
	for (size_t i = 0; i < 20; i++)
	for (size_t j = 0; j < 20; j++)
	if (v[i][j] == BLACK)
		printf("%d %d\n", i, j);

}


void func(){
	char s[10];
	gets(s);
	int a = 0, b = 0;
	size_t index = 0;
	while (index != strlen(s)){
		if (s[index] == ' ')break;
		a = a * 10 + s[index] - '0';
		index++;
	}
	index++;
	while (index < strlen(s)){
		b = b * 10 + s[index] - '0';
		index++;
	}

	if (b)two(a, b);
	else one(a);
}

int main(){

	//freopen("out.txt", "w", stdout);
	//freopen("in.txt", "r", stdin);

	func();

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值