题目大意:象棋里的马遍历所有的点,且每个点走一次,求总共有多少种走法,棋盘上刚开始还有障碍点(导致马在某些方向上不能跳)
解:深搜
易错点:还原状态;
当遍历成功时没能及时还原visited【】【】;其实可以把visited的负值与还原改成注释部分那样,这样更清晰且不易错;
思路不清:一定是在理清思路后再做!
main()函数里 忘掉return 0;
#include<iostream> using namespace std; int m,n,t; int sum=0; int dir[8][2]= { {-2,-1} ,{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2} }; int visited[7][7]; int map[7][7]; int deep(int x,int y,int flag) { flag++; visited[x][y]=1; if(flag==m*n-t) { visited[x][y]=0; sum++; return true; } int i; for(i=0;i<8;i++) { int s,t; switch(i/2) { case 0: s=x-1;t=y;break; case 1: s=x;t=y+1;break; case 2: s=x+1;t=y;break; case 3: s=x;t=y-1;break; } if(map[s][t]==1)continue; int p=dir[i][0]+x; int q=dir[i][1]+y; if(p>0&&p<=m&&q>0&&q<=n&&map[p][q]==0&&visited[p][q]==0) { // visited[p][q]=1; // flag++; deep(p,q,flag); // flag--; // visited[p][q]=0; } } visited[x][y]=0; return false; } int main() { int flag=0; while(cin>>m>>n>>t) { memset(visited,0,sizeof(visited)); sum=0; memset(map,0,sizeof(map)); if(t==-1) break; int i; int x,y; for(i=0;i<t;i++) { cin>>x>>y; map[x][y]=1; visited[x][y]=1; } //visited[1][1]=1; deep(1,1,0); cout<<sum<<endl; } return 0; }