天天看點

藍橋杯 剪格子

#include<stdio.h>
int dir[4][2]={0,1,0,-1,-1,0,1,0};
int vis[12][12],map[12][12];
int m,n,sum;
int check(int x,int y,int ans)
{
    if (x<1||y<1||x>n||y>m)
    return 0;
    if (vis[x][y])
    return 0;
    if (ans>sum/2)
        return 0;
    return 1;
}
int dfs(int x,int y,int ans)
{
    int i,p,q;
    if (ans==sum/2)
        return 1;
        for (i=0;i<4;i++)
    {
        p=x+dir[i][0];<span style="white-space:pre">				</span>//以(x,y)為原點,向周圍進行搜尋
        q=y+dir[i][1];
        if (check(p,q,ans))
          {
              vis[p][q]=1;
              int cnt=dfs(p,q,ans+map[p][q]);
              if (cnt)
                return cnt+1;
              vis[p][q]=0;<span style="white-space:pre">			</span>//退回
          }
    }
    return 0;
}
int main()
{
    int i,j;
    sum=0;
    scanf("%d%d",&m,&n);
    for (i=1;i<=n;i++)
       for (j=1;j<=m;j++)
          {
              scanf("%d",&map[i][j]);
              sum+=map[i][j];
          }
    if (sum%2)
    {
        printf("0\n");
        return 0;
    }
    vis[1][1]=0;
    printf("%d\n",dfs(1,1,map[1][1]));
    return 0;
}
           

一直不太會dfs,這個代碼還是參考高手寫的,一直感覺dfs就是三步走,判斷函數,dfs函數,主函數,但就是細節掌握不準,欠練