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