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;
}