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