首页 新闻 会员 周边 捐助

I’m stuck!不知道代码错在了哪里,感觉我举得样例都通过了还是错的,或者可以举一个这个代码跑错的样例吗?

0
悬赏园豆:5 [已关闭问题] 关闭于 2023-02-12 22:28


#include<stdio.h>
#include<stdlib.h>

int R, C, S, T; //S记录开始位置, T记录目标位置 
char *MAP; //地图
char *F1; //非0格子表示可以从起点到达的格子 
char *F2; //非0格子表示可以到达目的的格子 

//从格子G是否可以上移
bool CanUp(int G){
	if(G-C>=0 && MAP[G-C]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='|'))
		return true;
	else
		return false;
}

//从格子G是否可以下移
bool CanDown(int G){
	if(G+C<R*C && MAP[G+C]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='|'||MAP[G]=='.'))
		return true;
	else
		return false;
}

//从格子G是否可以左移
bool CanLeft(int G){
	if(G%C>0 && MAP[G-1]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='-'))
		return true;
	else
		return false;
}

//从格子G是否可以右移
bool CanRight(int G){
	if(G%C<C-1 && MAP[G+1]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='-'))
		return true;
	else
		return false;
}

//递归遍历可以从G到达的邻居并更改F1 
void ToNeighbor(int G){
	int n;//邻居位置
	//向上走 
	n = G - C; 
	if(!F1[n] && CanUp(G)){
		F1[n] = 1;
		ToNeighbor(n);
	}
	//向下走 
	n = G + C; 
	if(!F1[n] && CanDown(G)){
		F1[n] = 1;
		ToNeighbor(n);
	}
	//向左走 
	n = G - 1; 
	if(!F1[n] && CanLeft(G)){
		F1[n] = 1;
		ToNeighbor(n);
	}
	//向右走 
	n = G + 1; 
	if(!F1[n] && CanRight(G)){
		F1[n] = 1;
		ToNeighbor(n);
	}
}

//递归遍历可以到达G的邻居并更改F2
void FromNeighbor(int G){
	int n;//邻居位置
	//判断上邻居
	n = G - C;
	if(n >= 0 && MAP[n] != '#' && !F2[n] && CanDown(n)){
		F2[n] = 1;
		FromNeighbor(n);
	}
	//判断下邻居
	n = G + C;
	if(n < R*C && MAP[n] != '#' && !F2[n] && CanUp(n)){
		F2[n] = 1;
		FromNeighbor(n);
	}
	//判断左邻居
	n = G - 1;
	if(G%C > 0 && MAP[n] != '#' && !F2[n] && CanRight(n)){
		F2[n] = 1;
		FromNeighbor(n);
	}
	//判断右邻居
	n = G + 1;
	if(G%C < C-1 && MAP[n] != '#' && !F2[n] && CanLeft(n)){
		F2[n] = 1;
		FromNeighbor(n);
	}
}

int main(){
	
	//初始化 
	scanf("%d%d",&R,&C); fflush(stdin);
	MAP = (char*)malloc(sizeof(char) * R * C);
	F1 = (char*)malloc(sizeof(char) * R * C);
	F2 = (char*)malloc(sizeof(char) * R * C);
	for(int i = 0; i < R * C; i++){
		scanf(" %c",MAP + i);
		if(MAP[i] == 'S')
			S = i;
		if(MAP[i] == 'T')
			T = i;
		F1[i] = 0;
		F2[i] = 0;  
	}
	
	//填充F1(非0格子表示可以从起点到达的格子 ) 
	F1[S] = 1;
	ToNeighbor(S);//递归遍历可以从S到达的格子并更改F1 
	
	//填充F2(非0格子表示可以到达目的的格子) 
	F2[T] = 1;
	FromNeighbor(T);//递归遍历可以到达的T的格子并更改F1 
	
	if(!F1[T]){//从S不能到达T 
		printf("I'm stuck!");
		return 0;
	}
	
	//计数有特征的格子个数
	int q = 0;
	for(int i = 0; i < R*C; i++)
		if(F1[i] == 1 && F2[i] == 0)
			q++;
		
	printf("%d",q);
	
	return 0;
}
c csp
诸葛思颖的主页 诸葛思颖 | 初学一级 | 园豆:172
提问于:2023-02-12 17:31
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册