CCF 模拟E DFS深搜
http://115.28.138.223:81/view.page?opid=5
这道题问的很怪. 起点DFS,每一个点还要DFS一次,统计不能到终点的个数
数据量不大这样做也能AC
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int x,y,ax,ay,bx,by;//'#'0, '+'1, '-'2, '|'3, '.'4, 'S', 'T' int x1[]={1,-1,0, 0}; int y1[]={0, 0,1,-1}; int d[55][55],lable[55][55],labll[55][55]; int numb,shit=0; void ddfs(int xx,int yy) { if(shit==1){return;} if(xx==by&&yy==bx){shit=1;return;} if(labll[xx][yy]==2||d[xx][yy]==0||xx<0||yy<0){return;} labll[xx][yy]=2; if(d[xx][yy]==1) { for(int i=0;i<4;i++) { ddfs(xx+x1[i],yy+y1[i]); if(shit==1){return;} } } if(d[xx][yy]==2) { for(int i=2;i<4;i++) { ddfs(xx+x1[i],yy+y1[i]); if(shit==1){return;} } } if(d[xx][yy]==3) { for(int i=0;i<2;i++) { ddfs(xx+x1[i],yy+y1[i]); if(shit==1){return;} } } if(d[xx][yy]==4) { for(int i=0;i<1;i++) { ddfs(xx+x1[i],yy+y1[i]); if(shit==1){return;} } } return; } void dfs(int xx,int yy)//3 0 { if(lable[xx][yy]==1||d[xx][yy]==0||xx<0||yy<0){return;} lable[xx][yy]=1; for(int i=0;i<y;i++) { for(int j=0;j<x;j++) { labll[i][j]=0; } } shit=0; ddfs(xx,yy); if(shit==0){numb++;} if(d[xx][yy]==1) { for(int i=0;i<4;i++) { dfs(xx+x1[i],yy+y1[i]); } } if(d[xx][yy]==2) { for(int i=2;i<4;i++) { dfs(xx+x1[i],yy+y1[i]); } } if(d[xx][yy]==3) { for(int i=0;i<2;i++) { dfs(xx+x1[i],yy+y1[i]); } } if(d[xx][yy]==4) { for(int i=0;i<1;i++) { dfs(xx+x1[i],yy+y1[i]); } } return; } int main() { while(cin>>y>>x) { char c; numb=0; for(int i=0;i<y;i++) { for(int j=0;j<x;j++) { cin>>c; if(c=='S'){d[i][j]=1;ax=j;ay=i;} if(c=='T'){d[i][j]=1;bx=j;by=i;} if(c=='#'){d[i][j]=0;} if(c=='+'){d[i][j]=1;} if(c=='-'){d[i][j]=2;} if(c=='|'){d[i][j]=3;} if(c=='.'){d[i][j]=4;} } } shit=0; ddfs(ay,ax); if(shit==0){cout<<"I'm stuck!"<<endl;continue;} dfs(ay,ax); cout<<numb<<endl; for(int i=0;i<y;i++) { for(int j=0;j<x;j++) { d[i][j]=lable[i][j]=0; } } } return 0; }