zoj 1002 回溯

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

char a[5][5];
int n;
int sum;
string cinString;

inline void rg(int &a, int &b)
{
 a=(a>=b?a:b);
}
bool PathCut(int row, int col)
{
 int i,j;
 for(i=row-1;i>=1;i--)
 {
  if(a[i][col]=='.')
   continue;
  else if(a[i][col]=='X')
   break;
  else if(a[i][col]=='o')
   return false;
 }
 for(i=row+1;i<=n;i++)
 {
  if(a[i][col]=='.')
   continue;
  else if(a[i][col]=='X')
   break;
  else if(a[i][col]=='o')
   return false;
 }
 for(j=col-1;j>=1;j--)
 {
  if(a[row][j]=='.')
   continue;
  else if(a[row][j]=='X')
   break;
  else if(a[row][j]=='o')
   return false;
 }
 for(j=col+1;j<=n;j++)
 {
  if(a[row][j]=='.')
   continue;
  else if(a[row][j]=='X')
   break;
  else if(a[row][j]=='o')
   return false;
 }
 return true;
}
inline int modn(int num)
{
 if(num%n)
  return num%n;
 else
  return n;
}
inline int chun(int num)
{
 return (num+n-1)/n;
}
void solve(int k, int number)
{
 if(k==n*n)
 {
  rg(sum, number);
  return;
 }
 //else
 int tempK=k+1;
 int row=chun(tempK);
 int col=modn(tempK);
 if(a[row][col]=='.' && PathCut(row,col))
 {
  a[row][col]='o';
  solve(k+1, number+1);
  //回溯
  a[row][col]='.';
 }
 solve(k+1, number);
}
int main()
{
 ifstream cin("1.txt");
 int i,j;
 while(cin>>n && n)
 {
  sum=0;
  //memset(a,0,sizeof(a))
  for(i=1;i<=n;i++)
  {
   //cin>>cinString;
   for(j=1;j<=n;j++)
   {
    //a[i][j]=cinString[j-1];
    cin>>a[i][j];
   }
  }
  solve(0, 0);
  cout<<sum<<endl;  
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值