poj_1154_回溯基础题

来源:互联网 发布:淘宝手机端首页模版 编辑:程序博客网 时间:2024/05/20 22:03

题目描述:

  给一个矩阵列,矩阵元素为大写字母。起点为矩阵第一行第一列那格。看看走不重复的字母最多能走多少格。

 

解题思路:

   回溯,没啥好说。。。

 

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 21

char str[N][N];
int max=0,f[27];
int r,c,count;

void find(int i, int j)
{
   if(i>r)
   {
     if(count > max)
        max = count;
   }
   else
   {
     if(i>=2 &&f[str[i-1][j]-'A']==1)
     {
        f[str[i-1][j]-'A']=0;
        count ++;
        find(i-1,j);
        count --;
        f[str[i-1][j]-'A']=1;  
     }
     if(i<=r-1 &&f[str[i+1][j]-'A']==1)
     {
        f[str[i+1][j]-'A']=0;
        count ++;
        find(i+1,j);
        count --;
        f[str[i+1][j]-'A']=1;
     }
     if(j>=1 &&f[str[i][j-1]-'A']==1)
     {
        f[str[i][j-1]-'A']=0;
        count ++;
        find(i,j-1);
        count --;
        f[str[i][j-1]-'A']=1;
     }
     if(j<c-1 &&f[str[i][j+1]-'A']==1)
     {
        f[str[i][j+1]-'A']=0;
        count ++;
        find(i,j+1);
        count --;
        f[str[i][j+1]-'A']=1;
     }
     find(r+1,c);
   
}

main()
{
   int i,j;
   scanf("%d%d",&r,&c);
  for(i=1;i<=r;i++)
     scanf("%s",str[i]);
     
  for(i=0;i<26;i++)
     f[i] = 0;
  for(i=1;i<=r;i++)
     for(j=0;j<c;j++)
         f[str[i][j]-'A'] = 1;
   count = 1;
   f[str[1][0]-'A']=0;
   find(1,0);
  
   printf("%d\n",max);
  
   //system("pause");
   return 0;
}