深度搜索省赛题

 题目大意:象棋里的马遍历所有的点,且每个点走一次,求总共有多少种走法,棋盘上刚开始还有障碍点(导致马在某些方向上不能跳)

解:深搜

易错点:还原状态;

        当遍历成功时没能及时还原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;
}
原文地址:https://www.cnblogs.com/orangeblog/p/2512073.html