回溯法,八皇后问题
#include <stdio.h>
bool visited[9][9];
int arr[9][9];
int max;
void dfs(int cur_row, int last_sum)
{
int j;
int ii;
int target_i, target_j;
bool f;
if(cur_row == 9)
{
if(max < last_sum)
max = last_sum;
return;
}
if(cur_row == 1)
{
for(j=1; j<=8; j++)
{
visited[cur_row][j] = true;
dfs(cur_row+1, last_sum+arr[cur_row][j]);
visited[cur_row][j] = false;
}
}
else
{
for(j=1; j<=8; j++)
{
f = true;
for(ii=1; ii<cur_row; ii++)
if(visited[ii][j])
{
f = false;
break;
}
if(f)
{
for(ii=1; ii<cur_row; ii++)
{
target_i = ii;
target_j = j - (cur_row-ii);
if(target_j>=1 && target_j<=8)
{
if(visited[target_i][target_j])
{
f = false;
break;
}
}
target_i = ii;
target_j = j + (cur_row-ii);
if(target_j>=1 && target_j<=8)
{
if(visited[target_i][target_j])
{
f = false;
break;
}
}
}
}
if(!f)
continue;
visited[cur_row][j] = true;
dfs(cur_row+1, last_sum+arr[cur_row][j]);
visited[cur_row][j] = false;
}
}
}
void func()
{
max = 0;
dfs(1, 0);
printf("%5d\n", max);
}
int main(void)
{
int n;
int i, j;
//freopen("input.dat", "r", stdin);
scanf("%d", &n);
while(n--)
{
for(i=1; i<=8; i++)
{
for(j=1; j<=8; j++)
{
scanf("%d", arr[i]+j);
visited[i][j] = false;
}
}
func();
}
return 0;
}