UVa 11906 - Knight in a War Grid Solution

#include <iostream>
#include <vector>
using namespace std;
int t,r,c,m,n,w,cs;
vector<vector<int> > a,vis;
vector<int> dr,dc;
int eve,odd;
int fill(int x,int y){
    if(x<0||x>=r||y<0||y>=c||a[x][y]==-1)
        return 0;
    if(!vis[x][y]){
        vis[x][y]=1;
        int ans=fill(x+dr[0],y+dc[0]);
        if(m)
            ans+=fill(x+dr[2],y+dc[2]);
        if(n)
            ans+=fill(x+dr[1],y+dc[1]);
        if(m&&n)
            ans+=fill(x+dr[3],y+dc[3]);
        if(m!=n){
            ans+=fill(x+dr[4],y+dc[4]);
            if(m)
                ans+=fill(x+dr[6],y+dc[6]);
            if(n)
                ans+=fill(x+dr[5],y+dc[5]);
            if(m&&n)
                ans+=fill(x+dr[7],y+dc[7]);
        }
        if(ans&1)
            odd++;
        else
            eve++;
    }
    return 1;
}
int main(){
    cin>>t;
    while(t--){
        cs++;
        cin>>r>>c>>m>>n>>w;
        a.assign(r,vector<int>(c));
        vis.assign(r,vector<int>(c));
        while(w--){
            int x,y;
            cin>>x>>y;
            a[x][y]=-1;
        }
        dr={m,m,-m,-m,n,-n,n,-n};
        dc={n,-n,n,-n,m,m,-m,-m};
        eve=0,odd=0;
        fill(0,0);
        cout<<"Case "<<cs<<": "<<eve<<' '<<odd<<endl;
    }
}

Comments