1.N皇后问题
http://codevs.cn/problem/1295/
算法:经典的深度优先搜索问题。对于不同方向对角线的判重,需要开两个数组di1和di2。“/”型对角线按i+j-1编号,“\”型对角线按i-j+n编号。
代码:
#include<bits/stdc++.h>
#define MAX_N 14
using namespace std;
int n, res = 0;
bool vol[MAX_N], di1[MAX_N*2], di2[MAX_N*2];
void dfs(int i)
{
if (i == n+1)
res++;
else
{
for (int j = 1; j <= n; j++)
if (!vol[j] && !di1[i+j-1] && !di2[i-j+n])
{
vol[j] = 1; di1[i+j-1] = 1; di2[i-j+n] = 1;
dfs(i+1);
vol[j] = 0; di1[i+j-1] = 0; di2[i-j+n] = 0;
}
}
}
int main()
{
scanf("%d", &n);
dfs(1);
printf("%d", res);
return 0;
}
2.四色问题
http://codevs.cn/problem/1116/
算法:深度优先搜索,floodfill模型。
代码:
#include<bits/stdc++.h>
#define MAX_N 9
using namespace std;
int n, res = 0;
int col[MAX_N];
int a[MAX_N][MAX_N];
void dfs(int i)
{
if (i == n+1)
res++;
else
{
for (int k = 1; k <= 4; k++)
{
int okay = 1;
for (int j = 1; j <= n; j++)
if (a[i][j] && (col[j] == k))
{
okay = 0;
break;
}
if (okay)
{
col[i] = k;
dfs(i+1);
col[i] = 0;
}
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
dfs(1);
printf("%d", res);
return 0;
}
3.单词接龙(NOIP2000提高组)
http://codevs.cn/problem/1018/
算法:深度优先搜索。判重的时候要注意可以使用两次。unit(i,j)函数返回第i个单词和第j个单词连接后的长度。
代码:
#include<bits/stdc++.h>
#define MAX_N 21
#define MAX_LEN 101
using namespace std;
int n;
int used[MAX_N];
char word[MAX_N][MAX_LEN];
int unit(int i, int j)
{
int leni = strlen(word[i]);
int lenj = strlen(word[j]);
for (int cmn=1; cmn<min(leni, lenj); cmn++)
{
bool okay = 1;
for (int k=0; k<cmn; k++)
if (word[i][leni-cmn+k] != word[j][k])
{
okay = 0;
break;
}
if (okay) return leni+lenj-cmn;
}
return 0;
}
int srch(int i, int cur_len)
{
int not_found = 1;
int ret = 0;
for (int j=1; j<=n; j++)
if (used[j] < 2)
{
int len_ij = unit(i, j);
if (len_ij > 0)
{
not_found = 0;
used[j]++;
ret = max(ret, srch(j, cur_len+len_ij-strlen(word[i])));
used[j]--;
}
}
if (not_found)
return cur_len;
else
return ret;
}
int main()
{
scanf("%d", &n);
for (int i=1; i<=n; i++)
scanf("%s", word[i]);
scanf("%s", word[0]);
int res = 0;
for (int i=1; i<=n; i++)
if (word[i][0] == word[0][0])
{
memset(used, 0, sizeof(used));
used[i] = 1;
res = max(res, srch(i, strlen(word[i])));
}
printf("%d", res);
return 0;
}