//总结,求方案的数量用深搜,求最短的距离用宽搜
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,t;//n为行数,m为列数
const int N = 100,M = 100;
int g[N][M];//要定义两个,一个是是否走过,第二个是是否有障碍
int ans;
int temp[N][N];
int x1,y1,x2,y2;
//void bfs()
//{
// int hh = 0,tt = 0;
// int dix[4] = {-1,0,1,0};
// int diy[4] = {0,1,0,-1};
// while(hh<tt)
// {
// auto t =q[hh++];
// for(int i =0;i<4;++i)
// {
// int x =t.first+dix[i];
// int y = t.second+diy[i];
// if(x>0&&x<n&&y>0&&y<m && g[x][y] == 0)
// {
// q[++tt] = {x,y};
// }
// }
//
// }
// int x =n-1,y = m-1;
// //下面的问题是如何存方案,之前模板是求到终点的最短距离,所以开了个数组来存储,现在我的目的是求绕过障碍到终点的方案数,难倒用的不是宽度优先吗?日,貌似是深度优先。
//
//}
int dix[4] = {-1,0,1,0};
int diy[4] = {0,-1,0,1};
void dfs(int x1,int y1)
{
if(x1==x2&&y1==y2)
{
ans++;
return;
}
else
{
for(int i =0;i<=3;++i)//这两重循环只是为了走路
{
if(temp[x1+dix[i]][y1+diy[i]]==0&&g[x1+dix[i]][y1+diy[i]]==1)
{
temp[x1][y1] = 1;
dfs(x1+dix[i],y1+diy[i]);
temp[x1][y1] = 0;
}
}
}
}
int main()
{
cin>>n>>m>>t;
cin>>x1>>y1>>x2>>y2;
for(int ix=1;ix<=n;ix++)
for(int iy=1;iy<=m;iy++)//为什么用memset初始化成1和这种for循环初始化结果会不一样
g[ix][iy]=1;//把地图刷成1
for(int u =1;u<=t;++u)
{
int t1,t2;
cin>>t1>>t2;
g[t1][t2] = 0;
}
dfs(x1,y1);
cout<<ans<<endl;
return 0;
}
//看来还是自己太菜了,没能独立写出
//只能看题解了//其实百分之九十都写出来了,最后方向数组弄错了