暴力枚举解决问题
考前临时抱佛脚
#include<stdio.h>
int max(int x, int y)
{
if (x > y)return x;
else
return y;
}
int s[5], t[5][25], sum = 0, mark[5] = { 0,1200,1200,1200,1200};
void f(int left, int right, int step, int n)
{
if (step == s[n]) {
int tmp = max(left, right);
if (tmp < mark[n])mark[n] = tmp;
return;
}
step++;
f(left + t[n][step], right, step, n);
f(left, right+t[n][step], step, n);
}
int main() {
for (int i = 1; i <= 4; i++) {
scanf("%d", &s[i]);
}
for(int i=1;i<=4;i++)
for (int j = 1; j <= s[i]; j++) {
scanf("%d", &t[i][j]);
}
for (int i = 1; i <= 4; i++)
f(0, 0, 0, i);
for (int i = 1; i <= 4; i++)
sum += mark[i];
printf("%d", sum);
return 0;
}
次题关键就在于这俩行
f(left + t[n][step], right, step, n);
f(left, right+t[n][step], step, n);
暴力枚举出所有左脑和右脑选题方式,在俩个中选最长的,在最长的里面选出最短的。
还有八皇后问题
#include<stdio.h>
int mark,size, col[30], left[30], right[30], ans[30];
void setvalue(int x, int y, int k)
{
ans[x] = y;
col[y] = k;
left[x + y] = k;
right[x - y + size] = k;
}
void dfs(int step)//step代表当前是第几行
{
if (step > size) {
mark++;
if (mark <= 3) {
for (int i = 1; i <= size; i++)
printf("%d ", ans[i]);
printf("\n");
}
return;
}
for (int j = 1; j <= size; j++) {
//j代表当前是第几列
if (col[j] || left[step + j] || right[step - j + size])
continue;
setvalue(step, j, 1);
dfs(step + 1);
setvalue(step, j, 0);
}
}
int main()
{
scanf("%d", &size);
dfs(1);
printf("%d", mark);
return 0;
}
此题关键在于找到对角线之间的关系
//left存左下到右上的对角线(行+列的和相同)
//right存右下到左上的对角线(行-列的差相同)
还有同一列和同一行的不能填