CSP考试 2013年12月第5题 I’m stuck! C语言实现

时间:2021-01-26 21:32:21

CSP考试 2013年12月第5题 I’m stuck! C语言实现

CSP考试 2013年12月第5题 I’m stuck! C语言实现

#include <stdio.h>
#include <string.h> 
//分别从S,T开始进行DFS深度优先算法 
//使用两个DFS 
//60分 修改版 
//如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。
//正确 100 


// 5 5
// --+-+
// ..|#.
// ..|##
// S-+#T
// ####.
// I'm stuck!

// 5 5
// --+-+
// ..|#.
// ..|##
// T-+-S
// ####.
// 2

// 5 6
// --+-++
// ..|#.+
// ..|##+
// S-+-T+
// ####.+
// 2 

// 6 5 //5 6反过来 
// -..S#
// -..-#
// +||+#
// -##-#
// +.#T.
// +++++
// 有错误 

	void DFS(int NUM1,int NUM2,int* color,char* c,int x,int y)
	{
		//printf("DFS1 %d %d=%c\n",x,y,*(c+x*NUM2+y));

		//color[x][y]=1;
		*(color+x*NUM2+y)=1;//NUM1改为NUM2 +10 
		//if((c[x][y]=='S')||(c[x][y]=='+')||(c[x][y]=='T'))
		if((*(c+x*NUM2+y)=='S')||(*(c+x*NUM2+y)=='+')||(*(c+x*NUM2+y)=='T'))
		{
			//上
			if((x-1)>=0)
			{
				//if((color[x-1][y]==0)&&(c[x-1][y]!='#'))
				if((*(color+(x-1)*NUM2+y)==0)&&(*(c+(x-1)*NUM2+y)!='#'))
				{
					//printf("up1\n");
					DFS(NUM1,NUM2,color,c,x-1,y);
				}
			} 
			//下
			if((x+1)<NUM1)
			{
				//if((color[x+1][y]==0)&&(c[x+1][y]!='#'))
				if((*(color+(x+1)*NUM2+y)==0)&&(*(c+(x+1)*NUM2+y)!='#'))
				{
					//printf("down1\n");
					DFS(NUM1,NUM2,color,c,x+1,y);
				}
			}
			//左
			if((y-1)>=0)
			{
				//if((color[x][y-1]==0)&&(c[x][y-1]!='#'))
				if((*(color+x*NUM2+y-1)==0)&&(*(c+x*NUM2+y-1)!='#'))
				{
					//printf("left1\n");
					DFS(NUM1,NUM2,color,c,x,y-1);
				}
			}
			//右 
			if((y+1)<NUM2)
			{
				//if((color[x][y+1]==0)&&(c[x][y+1]!='#'))
				if((*(color+x*NUM2+y+1)==0)&&(*(c+x*NUM2+y+1)!='#'))
				{
					//printf("right1\n");
					DFS(NUM1,NUM2,color,c,x,y+1);
				}
			} 
		}else if(*(c+x*NUM2+y)=='-')//else if(c[x][y]=='-')
		{
			//左
			if((y-1)>=0)
			{
				//if((color[x][y-1]==0)&&(c[x][y-1]!='#'))
				if((*(color+x*NUM2+y-1)==0)&&(*(c+x*NUM2+y-1)!='#'))
				{
					//printf("left1\n");
					DFS(NUM1,NUM2,color,c,x,y-1);
				}
			}
			//右 
			if((y+1)<NUM2)
			{
				//if((color[x][y+1]==0)&&(c[x][y+1]!='#'))
				if((*(color+x*NUM2+y+1)==0)&&(*(c+x*NUM2+y+1)!='#'))
				{
					//printf("right1\n");
					DFS(NUM1,NUM2,color,c,x,y+1);
				}
			} 
		}else if(*(c+x*NUM2+y)=='|')//else if(c[x][y]=='|')
		{
			//上	
			if((x-1)>=0)
			{
				//if((color[x-1][y]==0)&&(c[x-1][y]!='#'))
				if((*(color+(x-1)*NUM2+y)==0)&&(*(c+(x-1)*NUM2+y)!='#'))
				{
					//printf("up1\n");
					DFS(NUM1,NUM2,color,c,x-1,y);
				}
			} 
			//下
			if((x+1)<NUM1)
			{
				//if((color[x+1][y]==0)&&(c[x+1][y]!='#'))
				if((*(color+(x+1)*NUM2+y)==0)&&(*(c+(x+1)*NUM2+y)!='#'))
				{
					//printf("down1\n");
					DFS(NUM1,NUM2,color,c,x+1,y);
				}
			}
		}else if(*(c+x*NUM2+y)=='.')//else if(c[x][y]=='.')//NUM1没变成NUM2 +30
		{
			//下
			if((x+1)<NUM1)
			{
				//if((color[x+1][y]==0)&&(c[x+1][y]!='#'))
				if((*(color+(x+1)*NUM2+y)==0)&&(*(c+(x+1)*NUM2+y)!='#'))
				{
					//printf("down1\n");
					DFS(NUM1,NUM2,color,c,x+1,y);
				}
			}
		}
	}
	void _DFS(int NUM1,int NUM2,int* color,char* c,int x,int y)
	{
		//printf("DFS2 %d %d=%c\n",x,y,*(c+x*NUM2+y));
		//color[x][y]=1;
		*(color+x*NUM2+y)=1;
		//上
		if((x-1)>=0)
		{
			//if((color[x-1][y]==0)&&(c[x-1][y]!='#'))
			if((*(color+(x-1)*NUM2+y)==0)&&(*(c+(x-1)*NUM2+y)!='#'))
			{
				//if((c[x-1][y]=='.')||(c[x-1][y]=='+')||(c[x-1][y]=='|')||(c[x-1][y]=='S')||(c[x-1][y]=='T')) 
				if((*(c+(x-1)*NUM2+y)=='.')||(*(c+(x-1)*NUM2+y)=='+')||(*(c+(x-1)*NUM2+y)=='|')||(*(c+(x-1)*NUM2+y)=='S')||(*(c+(x-1)*NUM2+y)=='T'))
				{
					//printf("up2\n");
					_DFS(NUM1,NUM2,color,c,x-1,y);
			    }
			}
		} 
		//下
		if((x+1)<NUM1)
		{
			//if((color[x+1][y]==0)&&(c[x+1][y]!='#'))
			if((*(color+(x+1)*NUM2+y)==0)&&(*(c+(x+1)*NUM2+y)!='#'))
			{
				//if((c[x+1][y]=='+')||(c[x+1][y]=='|')||(c[x+1][y]=='S')||(c[x+1][y]=='T'))
				if((*(c+(x+1)*NUM2+y)=='+')||(*(c+(x+1)*NUM2+y)=='|')||(*(c+(x+1)*NUM2+y)=='S')||(*(c+(x+1)*NUM2+y)=='T'))
				{
					//printf("down2\n");
					_DFS(NUM1,NUM2,color,c,x+1,y);
				}
			}
		}
		//左
		if((y-1)>=0)
		{
			//if((color[x][y-1]==0)&&(c[x][y-1]!='#'))
			if((*(color+(x)*NUM2+y-1)==0)&&(*(c+(x)*NUM2+y-1)!='#'))
			{
				//if((c[x][y-1]=='+')||(c[x][y-1]=='-')||(c[x][y-1]=='S')||(c[x][y-1]=='T'))
				if((*(c+(x)*NUM2+y-1)=='+')||(*(c+(x)*NUM2+y-1)=='-')||(*(c+(x)*NUM2+y-1)=='S')||(*(c+(x)*NUM2+y-1)=='T'))
				{
					//printf("left2\n");
					_DFS(NUM1,NUM2,color,c,x,y-1);
				}
			}
		}
		//右 
		if((y+1)<NUM2)
		{
			//if((color[x][y+1]==0)&&(c[x][y+1]!='#'))
			if((*(color+(x)*NUM2+y+1)==0)&&(*(c+(x)*NUM2+y+1)!='#'))
			{
				//if((c[x][y+1]=='+')||(c[x][y+1]=='-')||(c[x][y+1]=='S')||(c[x][y+1]=='T'))
				if((*(c+(x)*NUM2+y+1)=='+')||(*(c+(x)*NUM2+y+1)=='-')||(*(c+(x)*NUM2+y+1)=='S')||(*(c+(x)*NUM2+y+1)=='T'))
				{
					//printf("right2\n");
					_DFS(NUM1,NUM2,color,c,x,y+1);
				}	
			}
		} 
	}
int main()
{
	int NUM1;//行数 
	int NUM2;//列数 
	scanf("%d",&NUM1);
	scanf("%d",&NUM2);
	int i;
	int j;
	char c[NUM1][NUM2];
	for(i=0;i<NUM1;i++)
	{
		for(j=0;j<NUM2;j++)
		{
			scanf(" %c",&c[i][j]);
		}
	}
	
	int color[NUM1][NUM2]; 
	memset(color,0,sizeof(color));


	int a[NUM1][NUM2];
	memset(a,0,sizeof(a));
	int b[NUM1][NUM2];
	memset(b,0,sizeof(b));
	for(i=0;i<NUM1;i++)
	{
		for(j=0;j<NUM2;j++)
		{
			if(c[i][j]=='S')
			{
				DFS(NUM1,NUM2,color[0],c[0],i,j);
				int m,n;
				for(m=0;m<NUM1;m++)
				{
					for(n=0;n<NUM2;n++)
					{
						a[m][n]=color[m][n];
					}
				}/*
				printf("S\n");
				for(m=0;m<NUM1;m++)
				{
					printf("\n");
					for(n=0;n<NUM2;n++)
					{
						printf("%d ",color[m][n]);
					}
				}
				printf("\n");*/
				memset(color,0,sizeof(color));
			}
			if(c[i][j]=='T')
			{
				_DFS(NUM1,NUM2,color[0],c[0],i,j);
				int m,n;
				for(m=0;m<NUM1;m++)
				{
					for(n=0;n<NUM2;n++)
					{
						b[m][n]=color[m][n];
					}
				}/*
				printf("T\n");
				for(m=0;m<NUM1;m++)
				{
					printf("\n");
					for(n=0;n<NUM2;n++)
					{
						printf("%d ",color[m][n]);
					}
				}
				printf("\n");*/
				memset(color,0,sizeof(color));
			}
		}
	}
	
	for(i=0;i<NUM1;i++)
	{
		for(j=0;j<NUM2;j++)
		{
			if(c[i][j]=='T')
			{
				if(a[i][j]==0)
				{
					printf("I'm stuck!");
					return 0;
				}
			}
		}
	}
	
	int kaoshi=0;
	for(i=0;i<NUM1;i++)
	{
		for(j=0;j<NUM2;j++)
		{
			if((a[i][j]==1)&&(b[i][j]==0))
			{
				kaoshi++;
			}
		}
	}
	printf("%d",kaoshi);	
	/*
	printf("\n%d %d\n",NUM1,NUM2);
	for(i=0;i<NUM1;i++)
	{
		for(j=0;j<NUM2;j++)
		{
			if(c[i][j]=='T')
			printf("%c",c[i][j]);
		}
		printf("\n");
	}*/
	return 0;
} 
CSP考试 2013年12月第5题 I’m stuck! C语言实现