原题网址
题目描述
请你帮忙设计一个从城市
M
M
M到城市
Z
Z
Z的输油管道,现在已经把整个区域划分为
R
R
R行
C
C
C列,每个单元格可能是空的也可能是以下
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种:
- “ . . .”表示空;
- 字符“ ∣ | ∣”( A S C I I ASCII ASCII为 124 124 124)、“ − - −”、“ + + +”、“ 1 1 1”、“ 2 2 2”、“ 3 3 3”、“ 4 4 4”描述管道的形状;
- “ 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 1≤r,c≤25
解题思路
这道题有多种做法,如
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