این الگوریتم اول همه خونه های ماتریس رو صفر میکنه و با یه چیزی شبیه به BFS کار رو جلو میبره
ویرایش: حالا که فکر میکنم میبینم راه های خیلی ساده تری هم وجود داره. مثل روش پویا در حل مسأله ی مسیر (ترکیبیات -> اصل جمع)
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin>>n>>m;
int S[n][n];
for(int i=0; i<n; i++) //تمیز کردن
for(int j=0; j<n; j++)
S[i][j]=0;
for(int i=0; i<m; i++)
{
int x, y;
cin>>x>>y;
S[x-1][y-1]=-5;
}
S[0][0]=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(S[i][j]!=-5)
{
if(S[i][j]+1 < S[i][j+1] || S[i][j+1] == 0)
if(S[i][j+1] != -5)
S[i][j+1] = S[i][j]+1;
if(S[i][j]+1 < S[i+1][j] || S[i+1][j] == 0)
if(S[i+1][j] != -5)
S[i+1][j] = S[i][j]+1;
}
}
}
if(S[n-1][n-1] == 0)
cout<<-1<<endl;
else
cout<<(S[n-1][n-1])<<endl;
return 0;
}