http://acm.pku.edu.cn/JudgeOnline/problem?id=1071

Код:
#include<iostream>
using namespace std;
int b[1000][3],k,ge,m,n;  
bool a[102][102],pp;
void dfs(int x,int y,int k0){
  int i,p,q,f;
  p=b[k0][0];q=b[k0][1];f=b[k0][2];
  if(pp==1) return ;
  if(k0==k) {ge++;pp=1;return ;}
  if(p==q){
    if(f==1&&y+q<=n){
      for(i=0;i<=q;i++)
        if(a[x][y+i]==1) break;
        if(i==q+1) dfs(x,y+q,k0+1);}
    if(f==2&&y-q>=1){
      for(i=0;i<=q;i++)
        if(a[x][y-i]==1) break;
        if(i==q+1) dfs(x,y-q,k0+1);}
    if(f==3&&x-q>=1){
      for(i=0;i<=q;i++)
        if(a[x-i][y]==1) break;
        if(i==q+1) dfs(x-q,y,k0+1);}
    if(f==4&&x+q<=m){
      for(i=0;i<=q;i++)
        if(a[x+i][y]==1) break;
        if(i==q+1) dfs(x+q,y,k0+1);}
  }
  else {
    if(f==1&&y+q<=n){
      for(i=0;i<=q;i++)
        if(a[x][y+i]==1) break;
        if(i==q+1) dfs(x,y+q,k0+1);}
    if(f==2&&y-q>=1){
      for(i=0;i<=q;i++)
        if(a[x][y-i]==1) break;
        if(i==q+1) dfs(x,y-q,k0+1);}
    if(f==3&&x-q>=1){
      for(i=0;i<=q;i++)
        if(a[x-i][y]==1) break;
        if(i==q+1) dfs(x-q,y,k0+1);}
    if(f==4&&x+q<=m){
      for(i=0;i<=q;i++)
        if(a[x+i][y]==1) break;
        if(i==q+1) dfs(x+q,y,k0+1);}
    if(f==1&&y+p<=n){
      for(i=0;i<=p;i++)
        if(a[x][y+i]==1) break;
        if(i==p+1) dfs(x,y+p,k0+1);}
    if(f==2&&y-p>=1){
      for(i=0;i<=p;i++)
        if(a[x][y-i]==1) break;
        if(i==p+1) dfs(x,y-p,k0+1);}
    if(f==3&&x-p>=1){
      for(i=0;i<=p;i++)
        if(a[x-i][y]==1) break;
        if(i==p+1) dfs(x-p,y,k0+1);}
    if(f==4&&x+p<=m){
      for(i=0;i<=p;i++)
        if(a[x+i][y]==1) break;
        if(i==p+1) dfs(x+p,y,k0+1);}
  }
}
int main(){
  int i,j,t,sum;
  char c;
  cin>>t;
  while(t&&t--){
    cin>>m>>n;
    for(i=0;i<=101;i++)
      for(j=0;j<=101;j++) a[i][j]=1;
      for(i=1;i<=m;i++)
        for(j=1;j<=n;j++) cin>>a[i][j];
        k=0;
        while(cin>>b[k][0]>>b[k][1]){
          if(b[k][0]==0&&b[k][1]==0) break;
          cin>>c;
          if(c=='R') b[k][2]=1;
          else if(c=='L') b[k][2]=2;
          else if(c=='U') b[k][2]=3;
          else if(c=='D') b[k][2]=4;
          k++;}
        sum=0;
        for(i=1;i<=m;i++)
          for(j=1;j<=n;j++){
            if(a[i][j]==0){
              ge=0;pp=0;
              dfs(i,j,0);
              sum+=ge;}
          }
          cout<<sum<<endl;}
  return 0;
}