方阵中有黑白点,黑点以.表示,白点以#表示。一个人从黑点开始,记为@; 只能从一个黑点到另一个黑点,问他最多能踩几个黑点。 分析: 可采用回溯法, 源代码如下: #include"iostream" #include"string" using namespace std; char a[30][30]; int b[30][30],m,n,x1,y1; int g[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int ff(int x,int y) { if(a[x][y]=='#') { return 0; } else { int i, zx ,zy; for(i=0;i<4;i++) { if(a[x][y]=='.'||a[x][y]=='@') { zx=x+g[i][0]; zy=y+g[i][1]; b[x][y]=1; a[x][y]='#'; if(b[zx][zy]==0) ff(zx,zy); a[x][y]='.'; } } } return 0; } int main() { freopen("in.txt","r",stdin); while(cin>>m>>n) { int i,j; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j]=='@') { x1=i; y1=j; } } for(i=0;i<=n+1;i++) { a[i][0]='#'; a[i][m+1]='#'; } for(j=0;j<=m+1;j++) { a[0][j]='#'; a[n+1][j]='#'; } ff(x1,y1); int max=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(b[i][j]==1) { max++; } } cout<<max<<endl; memset(b,0,sizeof(b)); } return 0; }