站外题求助
  • 板块学术版
  • 楼主_shine_
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/4/23 17:33
  • 上次更新2023/10/23 17:42:56
查看原帖
站外题求助
525141
_shine_楼主2023/4/23 17:33

rt,站外题,此题题目大意: 达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上。

翰翰的家里有一辆飞行车。

有一天飞行车的电路板突然出现了故障,导致无法启动。

电路板的整体结构是一个 R 行 C 列的网格(R,C≤500)。

每个格点都是电线的接点,每个格子都包含一个电子元件。

电子元件的主要部分是一个可旋转的、连接一条对角线上的两个接点的短电缆。

在旋转之后,它就可以连接另一条对角线的两个接点。

电路板左上角的接点接入直流电源,右下角的接点接入飞行车的发动装置。

达达发现因为某些元件的方向不小心发生了改变,电路板可能处于断路的状态。

她准备通过计算,旋转最少数量的元件,使电源与发动装置通过若干条短缆相连。

不过,电路的规模实在是太大了,达达并不擅长编程,希望你能够帮她解决这个问题。

注意:只能走斜向的线段,水平和竖直线段不能走。 输入格式

输入文件包含多组测试数据。

第一行包含一个整数 T

,表示测试数据的数目。

对于每组测试数据,第一行包含正整数 R 和 C

,表示电路板的行数和列数。

之后 R 行,每行 C

个字符,字符是"/"和""中的一个,表示标准件的方向。 输出格式

对于每组测试数据,在单独的一行输出一个正整数,表示所需的最小旋转次数。

如果无论怎样都不能使得电源和发动机之间连通,输出 NO SOLUTION。 数据范围

1≤R,C≤500 , 1≤T≤5

输入样例:

1
3 5
\\/\\
\\///
/\\\\

输出样例:

1

样例解释

样例的输入对应于题目描述中的情况。

只需要按照下面的方式旋转标准件,就可以使得电源和发动机之间连通。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e2+10;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
    while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;ch=getchar();
	}
    while(ch>='0'&&ch<='9'){
    	s=s*10+ch-'0';
		ch=getchar();
	}
    return s*w;
}
inline void write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9)write(x/10);
    putchar(x % 10 + '0');
}
int T;
int r,c;
int g[maxn][maxn];

bool vis[maxn][maxn];
int ans[maxn][maxn];
bool check(int a,int b){
	if(a<0 || a>r || b<0 || b>c)return true;
	else return false;
}
int in[]={-1,-1,1,1},on[]={-1,1,1-1};
int up[]={-1,-1,0,0},down[]={-1,0,0,-1};
char getning[]="\\/\\/";
signed main(){
	T=read();
	while(T--){
		r=read(),c=read();
		for(int i=0;i<r;++i){
			for(int j=0;j<c;++j){
				scanf("%c",&g[i][j]);
			}
		}
		memset(ans,INT_MAX,sizeof(ans));
		deque<pair<int,int> >q;
		q.push_front({0,0});
		ans[0][0]=0;
		while(q.size()!=0){
			pair<int,int>sum=q.front();
			q.pop_front();
			for(int i=0;i<4;++i){
				int a=sum.first+in[i],b=sum.second+on[i];
				if(check(a,b)==true){
					continue;;
				}else{
					int x=sum.first+up[i],y=sum.second+down[i];
					int flag=false;
					if(g[x][y]!=getning[i]){
						flag=true;
					}
					if(ans[a][b]>ans[sum.first][sum.second]+flag){
						ans[a][b]=ans[sum.first][sum.second]+flag;
						if(flag){
							q.push_back({a,b});
						}else{
							q.push_front({a,b});
						}
					}
				}
			}
		}
		if(ans[r][c]==INT_MAX){
			puts("NO SOLUTION");
		}else{
			printf("%d\n",ans[r][c]);
		}
	}
	return 0;
}

2023/4/23 17:33
加载中...