下载了一个数据(#2):
Input:
5 5 5
1 2 5 5
2 1
2 2
2 3
2 4
3 4
Output:
10
Code:(如果觉得看得不顺眼,可以看下面这那个)
#include<iostream>
#include<cstring>
using namespace std;
const int N=15;
int n,m,t,sx,sy,fx,fy,a[N][1],ans=0;
bool vis[N][N];//表记数组
void dfs(int x,int y){//x为纵轴,y为横轴
if(x==fx&&y==fy){ans++;return;}
else{
vis[x][y]=0;//把当前点标记成走过了
if(x+1>=1&&x+1<=m&&vis[x+1][y]!=0)/*可以走且未超边界*/{dfs(x+1,y);/*搜*/vis[x+1][y]==1;/*回溯*/}
if(y+1>=1&&y+1<=n&&vis[x][y+1]!=0)/*可以走且未超边界*/{dfs(x,y+1);/*搜*/vis[x][y+1]==1;/*回溯*/}
if(x-1>=1&&x-1<=m&&vis[x-1][y]!=0)/*可以走且未超边界*/{dfs(x-1,y);/*搜*/vis[x-1][y]==1;/*回溯*/}
if(y-1>=1&&y-1<=m&&vis[x][y-1]!=0)/*可以走且未超边界*/{dfs(x,y-1);/*搜*/vis[x][y-1]==1;/*回溯*/}
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
memset(vis,1,sizeof(vis));//标记初始化为true
cin>>n>>m>>t;//n为长,m为宽
cin>>sx>>sy>>fx>>fy;
for(int i=1;i<=t;i++)cin>>a[i][0]>>a[i][1];//输入
for(int i=1;i<=t;i++)vis[a[i][0]][a[i][1]]=false;//把不能走的标记为false
dfs(sx,sy);//深搜
cout<<ans<<endl;
return 0;
}
这个格式化了(DEV-C++的Allman括号风格):
#include<iostream>
#include<cstring>
using namespace std;
const int N=15;
int n,m,t,sx,sy,fx,fy,a[N][1],ans=0;
bool vis[N][N];//表记数组
void dfs(int x,int y) //x为纵轴,y为横轴
{
if(x==fx&&y==fy)
{
ans++;
return;
}
else
{
vis[x][y]=0;//把当前点标记成走过了
if(x+1>=1&&x+1<=m&&vis[x+1][y]!=0)/*可以走且未超边界*/
{
dfs(x+1,y);/*搜*/vis[x+1][y]==1;/*回溯*/
}
if(y+1>=1&&y+1<=n&&vis[x][y+1]!=0)/*可以走且未超边界*/
{
dfs(x,y+1);/*搜*/vis[x][y+1]==1;/*回溯*/
}
if(x-1>=1&&x-1<=m&&vis[x-1][y]!=0)/*可以走且未超边界*/
{
dfs(x-1,y);/*搜*/vis[x-1][y]==1;/*回溯*/
}
if(y-1>=1&&y-1<=m&&vis[x][y-1]!=0)/*可以走且未超边界*/
{
dfs(x,y-1);/*搜*/vis[x][y-1]==1;/*回溯*/
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(vis,1,sizeof(vis));//标记初始化为true
cin>>n>>m>>t;//n为长,m为宽
cin>>sx>>sy>>fx>>fy;
for(int i=1; i<=t; i++)cin>>a[i][0]>>a[i][1]; //输入
for(int i=1; i<=t; i++)vis[a[i][0]][a[i][1]]=false; //把不能走的标记为false
dfs(sx,sy);//深搜
cout<<ans<<endl;
return 0;
}
谢谢大佬们讲解