DP
#include <iostream>
int a, b;
using namespace std;
int map[20][20];
int gap[20][20];
int main()
{
cin >> a >> b;
int inx, iny;
int t;
cin >> t;
while (t--)
{
cin >> inx >> iny;
gap[iny][inx] = 1;
}
bool sign = false;
for (int i = 1; i <= a; i++)
{
if (sign == false && gap[1][i] == 0)
{
map[1][i] = 1;
}
else if (gap[1][i] == 1 || sign == true)
{
map[1][i] = 0;
sign = true;
}
}
sign = false;
for (int i = 1; i <= b; i++)
{
if (sign == false && gap[i][1] == 0)
{
map[i][1] = 1;
}
else if (gap[i][1] == 1 || sign == true)
{
map[i][1] = 0;
sign = true;
}
}
for (int i = 2; i <= b; i++)
{
for (int j = 2; j <= a; j++)
{
if (gap[i][j] == 0)
{
map[i][j] = map[i - 1][j] + map[i][j - 1];
}
}
}
cout << map[b][a] << endl;
}
DFS
#include <iostream>
using namespace std;
bool map[20][20];
int movex[] = { 0, 1 };
int movey[] = { 1, 0 };
int xm, ym;
int cnt;
void dfs(int x, int y)
{
if (x <= 0 || y <= 0 || x > xm || y > ym || map[x][y] == 1)
{
return;
}
if (x == xm && y == ym)
{
cnt++;
return;
}
map[x][y] = 1;
for (int i = 0; i < 2; i++)
{
dfs(x + movex[i], y + movey[i]);
}
map[x][y] = 0;
}
int main()
{
cin >> ym >> xm;
int t;
cin >> t;
int inx, iny;
while (t--)
{
cin >> iny >> inx;
map[inx][iny] = 1;
}
dfs(1, 1);
cout << cnt << endl;
}
BFS
#include <iostream>
#include <queue>
using namespace std;
int movex[] = { 0,1 };
int movey[] = { 1, 0 };
int map[20][20];
queue<pair<int, int> > q;
int cnt, xm, ym;
void bfs(int x, int y)
{
pair<int, int> temp;
temp = make_pair(x, y);
q.push(temp);
while (!q.empty())
{
pair<int, int> x = q.front();
q.pop();
for (int i = 0; i < 2; i++)
{
int xnow = x.first + movex[i];
int ynow = x.second + movey[i];
if (map[xnow][ynow] == 1 || xnow <= 0 || xnow > xm || ynow <= 0 || ynow > ym)
{
continue;
}
if (xnow == xm && ynow == ym)
{
cnt++;
continue;
}
temp = make_pair(xnow, ynow);
q.push(temp);
}
}
}
int main()
{
cin >> ym >> xm;
int t, inx, iny;
cin >> t;
while (t--)
{
cin >> iny >> inx;
map[inx][iny] = 1;
}
bfs(1, 1);
cout << cnt << endl;
}