【纪中】2022.7.16 1432.输油管道

原题网址

由于某些原因,这个网址会进不去…

题目描述

请你帮忙设计一个从城市 M M M到城市 Z Z Z的输油管道,现在已经把整个区域划分为 R R R C C C列,每个单元格可能是空的也可能是以下 7 7 7种基本管道之一:7种基本管道
油从城市 M M M流向 Z Z Z,“ + + +”型管道比较特殊,因为石油必须在两个方向(垂直和水平)上传输,如下图所示:
“+”型管道
现在恐怖分子弄到了输油管道的设计图,并把其中一个单元格中的管道偷走了,请你帮忙找到偷走的管道的位置以及形状。

格式

输入格式

1 1 1行包含 2 2 2个整数 R R R C C C
接下来 R R R行每行 C C C个字符描述被偷之后的形状,字符分为以下 3 3 3种:

  1. . . .”表示空;
  2. 字符“ ∣ | ”( A S C I I ASCII ASCII 124 124 124)、“ − - ”、“ + + +”、“ 1 1 1”、“ 2 2 2”、“ 3 3 3”、“ 4 4 4”描述管道的形状;
  3. M M M”和“ Z Z Z”表示城市, 2 2 2个都只出现 1 1 1次。

输入保证石油的流向是唯一的,只有一个管道跟 M M M Z Z Z相连,除此此外,保证没有多余的管道,也就是说所有的管道在加进被偷的管道后一定都会被用上。
输入保证有解而且是唯一的。

输出格式

输出被偷走的管道的行号和列号以及管道的类型。

样例

输入样例

输入样例1

3 7
.......
.M-.-Z.
.......

输入样例2

3 5
..1-M
1-+..
Z.23.

输入样例3

6 10
Z.1----4..
|.|....|..
|..14..M..
2-+++4....
..2323....
..........

输出样例

输出样例1

2 4 -

输出样例2

2 4 4

输出样例3

3 3 |

提示

1 ≤ r , c ≤ 25 1\le r,c\le25 1r,c25

解题思路

这道题有多种做法,如 b f s bfs bfs、大模拟等。
由于大模拟简单粗暴,受到本人喜爱,且本人过于 l a z y lazy lazy,因此没有打其它算法。

Code

警告

以下代码又长又臭,可能具有生命危险

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s;
char a[30][30];
bool check(char b[30][30],int x,int y,int f,int t) {
	while(b[x][y]!='Z') {
		t++;
		switch(b[x][y]) {
			case '-':{
				if(f==3) y--;
				else y++;
				break;
			}
			case '|':{
				if(f==1) x--;
				else x++;
				break;
			}
			case '+':{
				if(f==1) x--;
				else if(f==2) x++;
				else if(f==3) y--;
				else y++;
				break;
			}
			case '1':{
				if(f==1) {
					y++;
					f=4;
				}
				else {
					x++;
					f=2;
				}
				break;
			}
			case '2':{
				if(f==2) {
					y++;
					f=4;
				}
				else {
					x--;
					f=1;
				}
				break;
			}
			case '3':{
				if(f==2) {
					y--;
					f=3;
				}
				else {
					x--;
					f=1;
				}
				break;
			}
			case '4':{
				if(f==1) {
					y--;
					f=3;
				}
				else {
					x++;
					f=2;
				}
				break;
			}
			default:{
				return false;
			}
		}
	}
	return t-1==s;
}
bool test_left_down(int x,int y,int t) {
	if(a[x+1][y]=='.'&&(a[x+1][y-1]=='-'||a[x+1][y-1]=='+'||
	a[x+1][y-1]=='1'||a[x+1][y-1]=='2'||
	a[x+1][y-1]=='Z')) {
		a[x+1][y]='3';
		if(check(a,x+1,y,2,t)) {
			printf("%d %d 3",x+1,y);
			return true;
		}
		a[x+1][y]='+';
		if(check(a,x+1,y,2,t-1)) {
			printf("%d %d +",x+1,y);
			return true;
		}
		a[x+1][y]='.';
	}
	if(a[x][y-1]=='.'&&(a[x+1][y-1]=='|'||a[x+1][y-1]=='+'||
	a[x+1][y-1]=='2'||a[x+1][y-1]=='3'||
	a[x+1][y-1]=='Z')) {
		a[x][y-1]='1';
		if(check(a,x,y-1,3,t)) {
			printf("%d %d 1",x,y-1);
			return true;
		}
		a[x][y-1]='+';
		if(check(a,x,y-1,3,t-1)) {
			printf("%d %d +",x,y-1);
			return true;
		}
		a[x][y-1]='.';
	}
	return false;
}
bool test_left_up(int x,int y,int t) {
	if(a[x-1][y]=='.'&&(a[x-1][y-1]=='-'||a[x-1][y-1]=='+'||
	a[x-1][y-1]=='1'||a[x-1][y-1]=='2'||
	a[x-1][y-1]=='Z')) {
		a[x-1][y]='4';
		if(check(a,x-1,y,1,t)) {
			printf("%d %d 4",x-1,y);
			return true;
		}
		a[x-1][y]='+';
		if(check(a,x-1,y,1,t-1)) {
			printf("%d %d +",x-1,y);
			return true;
		}
		a[x-1][y]='.';
	}
	if(a[x][y-1]=='.'&&(a[x-1][y-1]=='|'||a[x-1][y-1]=='+'||
	a[x-1][y-1]=='1'||a[x-1][y-1]=='4'||
	a[x-1][y-1]=='Z')) {
		a[x][y-1]='2';
		if(check(a,x,y-1,3,t)) {
			printf("%d %d 2",x,y-1);
			return true;
		}
		a[x][y-1]='+';
		if(check(a,x,y-1,3,t-1)) {
			printf("%d %d +",x,y-1);
			return true;
		}
		a[x][y-1]='.';
	}
	return false;
}
bool test_right_down(int x,int y,int t) {
	if(a[x+1][y]=='.'&&(a[x+1][y+1]=='-'||a[x+1][y+1]=='+'||
	a[x+1][y+1]=='3'||a[x+1][y+1]=='4'||
	a[x+1][y+1]=='Z')) {
		a[x+1][y]='2';
		if(check(a,x+1,y,2,t)) {
			printf("%d %d 2",x+1,y);
			return true;
		}
		a[x+1][y]='+';
		if(check(a,x+1,y,2,t-1)) {
			printf("%d %d +",x+1,y);
			return true;
		}
		a[x+1][y]='.';
	}
	if(a[x][y+1]=='.'&&(a[x+1][y+1]=='|'||a[x+1][y+1]=='+'||
	a[x+1][y+1]=='2'||a[x+1][y+1]=='3'||
	a[x+1][y+1]=='Z')) {
		a[x][y+1]='4';
		if(check(a,x,y+1,4,t)) {
			printf("%d %d 4",x,y+1);
			return true;
		}
		a[x][y+1]='+';
		if(check(a,x,y+1,4,t-1)) {
			printf("%d %d +",x,y+1);
			return true;
		}
		a[x][y+1]='.';
	}
	return false;
}
bool test_right_up(int x,int y,int t) {
	if(a[x-1][y]=='.'&&(a[x-1][y+1]=='-'||a[x-1][y+1]=='+'||
	a[x-1][y+1]=='3'||a[x-1][y+1]=='4'||
	a[x-1][y+1]=='Z')) {
		a[x-1][y]='1';
		if(check(a,x-1,y,1,t)) {
			printf("%d %d 1",x-1,y);
			return true;
		}
		a[x-1][y]='+';
		if(check(a,x-1,y,1,t-1)) {
			printf("%d %d +",x-1,y);
			return true;
		}
		a[x-1][y]='.';
	}
	if(a[x][y+1]=='.'&&(a[x-1][y+1]=='|'||a[x-1][y+1]=='+'||
	a[x-1][y+1]=='1'||a[x-1][y+1]=='4'||
	a[x-1][y+1]=='Z')) {
		a[x][y+1]='3';
		if(check(a,x,y+1,4,t)) {
			printf("%d %d 3",x,y+1);
			return true;
		}
		a[x][y+1]='+';
		if(check(a,x,y+1,4,t-1)) {
			printf("%d %d +",x,y+1);
			return true;
		}
		a[x][y+1]='.';
	}
	return false;
}
bool test_down(int x,int y,int t) {
	if(test_left_down(x,y,t)) return true;
	if(test_right_down(x,y,t)) return true;
	if(a[x+1][y]=='.'&&(a[x+2][y]=='|'||a[x+2][y]=='+'||
	a[x+2][y]=='2'||a[x+2][y]=='3'||
	a[x+2][y]=='Z')) {
		a[x+1][y]='|';
		if(check(a,x+1,y,2,t)) {
			printf("%d %d |",x+1,y);
			return true;
		}
		a[x+1][y]='+';
		if(check(a,x+1,y,2,t-1)) {
			printf("%d %d +",x+1,y);
			return true;
		}
		a[x+1][y]='.';
	}
	return false;
}
bool test_up(int x,int y,int t) {
	if(test_left_up(x,y,t)) return true;
	if(test_right_up(x,y,t)) return true;
	if(a[x-1][y]=='.'&&(a[x-2][y]=='|'||a[x-2][y]=='+'||
	a[x-2][y]=='1'||a[x-2][y]=='4'||
	a[x-2][y]=='Z')) {
		a[x-1][y]='|';
		if(check(a,x-1,y,1,t)) {
			printf("%d %d |",x-1,y);
			return true;
		}
		a[x-1][y]='+';
		if(check(a,x-1,y,1,t-1)) {
			printf("%d %d +",x-1,y);
			return true;
		}
		a[x-1][y]='.';
	}
	return false;
}
bool test_right(int x,int y,int t) {
	if(test_right_up(x,y,t)) return true;
	if(test_right_down(x,y,t)) return true;
	if(a[x][y+1]=='.'&&(a[x][y+2]=='-'||a[x][y+2]=='+'||
	a[x][y+2]=='3'||a[x][y+2]=='4'||
	a[x][y+2]=='Z')) {
		a[x][y+1]='-';
		if(check(a,x,y+1,4,t)) {
			printf("%d %d -",x,y+1);
			return true;
		}
		a[x][y+1]='+';
		if(check(a,x,y+1,4,t-1)) {
			printf("%d %d +",x,y+1);
			return true;
		}
		a[x][y+1]='.';
	}
	return false;
}
bool test_left(int x,int y,int t) {
	if(test_left_down(x,y,t)) return true;
	if(test_left_up(x,y,t)) return true;
	if(a[x][y-1]=='.'&&(a[x][y-2]=='-'||a[x][y-2]=='+'||
	a[x][y-2]=='1'||a[x][y-2]=='2')) {
		a[x][y-1]='-';
		if(check(a,x,y-1,3,t)) {
			printf("%d %d -",x,y-1);
			return true;
		}
		a[x][y-1]='+';
		if(check(a,x,y-1,3,t-1)) {
			printf("%d %d +",x,y-1);
			return true;
		}
		a[x][y-1]='.';
	}
	return false;
}
void work(int x,int y,int f,int t) {
	t++;
	switch(a[x][y]) {
		case 'M':{
			t--;
			if(a[x-1][y]=='|'||a[x-1][y]=='1'||
			a[x-1][y]=='4'||a[x-1][y]=='+') {
				f=1;
				work(x-1,y,f,t);
			}
			else if(a[x+1][y]=='|'||a[x+1][y]=='2'||
			a[x+1][y]=='3'||a[x-1][y]=='+') {
				f=2;
				work(x+1,y,f,t);
			}
			else if(a[x][y-1]=='-'||a[x][y-1]=='+'||
			a[x][y-1]=='1'||a[x][y-1]=='2') {
				f=3;
				work(x,y-1,f,t);
			}
			else if(a[x][y+1]=='-'||a[x][y+1]=='+'||
			a[x][y+1]=='3'||a[x][y+1]=='4') {
				f=4;
				work(x,y+1,f,t);
			}
			else {
				if(test_left(x,y,t)) return;
				if(test_right(x,y,t)) return;
				if(test_up(x,y,t)) return;
				if(test_down(x,y,t)) return;
			}
			break;
		}
		case '|':{
			if(f==1) {
				if(a[x-1][y]!='.') work(x-1,y,f,t);
				else {
					test_up(x,y,t);
					return;
				}
			}
			else {
				if(a[x+1][y]!='.') work(x+1,y,f,t);
				else {
					test_down(x,y,t);
					return;
				}
			}
			break;
		}
		case '-':{
			if(f==3) {
				if(a[x][y-1]!='.') work(x,y-1,f,t);
				else {
					test_left(x,y,t);
					return;
				}
			}
			else {
				if(a[x][y+1]!='.') work(x,y+1,f,t);
				else {
					test_right(x,y,t);
					return;
				}
			}
			break;
		}
		case '+':{
			if(f==1) {
				if(a[x-1][y]!='.') work(x-1,y,f,t);
				else {
					test_up(x,y,t);
					return;
				}
			}
			else if(f==2) {
				if(a[x+1][y]!='.') work(x+1,y,f,t);
				else {
					test_down(x,y,t);
					return;
				}
			}
			else if(f==3) {
				if(a[x][y-1]!='.') work(x,y-1,f,t);
				else {
					test_left(x,y,t);
					return;
				}
			}
			else {
				if(a[x][y+1]!='.') work(x,y+1,f,t);
				else {
					test_right(x,y,t);
					return;
				}
			}
			break;
		}
		case '1':{
			if(f==1) {
				if(a[x][y+1]!='.') work(x,y+1,4,t);
				else {
					test_right(x,y,t);
					return;
				}
			}
			else {
				if(a[x+1][y]!='.') work(x+1,y,2,t);
				else {
					test_down(x,y,t);
					return;
				}
			}
			break;
		}
		case '2':{
			if(f==2) {
				if(a[x][y+1]!='.') work(x,y+1,4,t);
				else {
					test_right(x,y,t);
					return;
				}
			}
			else {
				if(a[x-1][y]!='.') work(x-1,y,1,t);
				else {
					test_up(x,y,t);
					return;
				}
			}
			break;
		}
		case '3':{
			if(f==2) {
				if(a[x][y-1]!='.') work(x,y-1,3,t);
				else {
					test_left(x,y,t);
					return;
				}
			}
			else {
				if(a[x-1][y]!='.') work(x-1,y,1,t);
				else {
					test_up(x,y,t);
					return;
				}
			}
			break;
		}
		case '4':{
			if(f==1) {
				if(a[x][y-1]!='.') work(x,y-1,3,t);
				else {
					test_left(x,y,t);
					return;
				}
			}
			else {
				if(a[x+1][y]!='.') work(x+1,y,2,t);
				else {
					test_down(x,y,t);
					return;
				}
			}
			break;
		}
	}
}
signed main() {
	cin>>n>>m;
	int x,y;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			cin>>a[i][j];
			if(a[i][j]=='M') {
				x=i,y=j;
			}
			else if(a[i][j]!='.'&&a[i][j]!='Z') s++;
			if(a[i][j]=='+') s++;
		}
	}
	work(x,y,0,0);
	return 0;
}

版权

Icons provided by Bootstrap

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值