http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1002
浙江大学acm judge online 1002
一看这题目,在算法书看到过,而且数据也不是太大,就算枚举也根本不会超时
一想,可以采用回溯法,谁知上网一查,基本上都采用了回溯法
浙江大学acm judge online 1002
一看这题目,在算法书看到过,而且数据也不是太大,就算枚举也根本不会超时
一想,可以采用回溯法,谁知上网一查,基本上都采用了回溯法
下面是AC的C代码:
#include < stdio.h>
char map[4][4];
int best,n;
int P(int row, int col)//判断在row,col处是否可以放;
{
int i;
for (i = row - 1; i >= 0; i--)
{
if (map[i][col] == 'O') return 0;
if (map[i][col] == 'X') break;
}
for (i = col - 1; i >= 0; i--)
{
if (map[row][i] == 'O') return 0;
if (map[row][i] == 'X') break;
}
return 1;
}
void solve(int k,int tot)
{
int x,y;
if(k==n*n)//如果到了最后,找出最大的可能值;
{
if(tot>best)
{
best=tot;
return;
}
}
else
{
x = k / n;
y = k % n;
if((map[x][y] == '.') && (P(x,y) ) )
{
map[x][y] = 'O';
solve(k + 1,tot + 1);
map[x][y] = '.';//回溯;
}
solve(k + 1,tot);
}
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i = 0;i < n;i++)
for(j = 0;j < n;j++)
scanf("%1s",&map[i][j]); /*输入单个字符并且忽略空白*/
best=0;
solve(0,0);
printf("%d\n",best);
}
return 0;
}