您的位置:首页 > 其它

XDU寒假集训:week2-简单搜索

2019-02-13 22:05 357 查看

week2因为科三练车鸽的有点严重,下来要加紧补辽

(科三还没过啊摔

A:棋盘问题,类似八皇后,经典搜索,时间够,直接写

注意不在此列放置棋子的情况的递归所放置的位置

[code]#include<cstdio>
int n,k;
int cnt,ans;
int book[10];
int map[10][10];
void dfs(int step)
{

if(cnt==k)
{
ans++;
return;
}
if(step>n)
return;
for(int i=1;i<=n;i++)
{
if(map[step][i]==0&&book[i]==0)
{
book[i]=1;
cnt++;
dfs(step+1);
cnt--;
book[i]=0;

}
}
dfs(step+1);
return;
}
int main()
{
while(scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1)
break;
getchar();
ans=0,cnt=0;
for(int i=1;i<=n;i++)
book[i]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
char c=getchar();
switch(c)
{
case '#':map[i][j]=0;break;
case '.':map[i][j]=1;break;
default :break;
}
}
getchar();
}
dfs(1);
printf("%d\n",ans);
}
return 0;
}

B:待补

C:待补

D:

题意:给n个棒子,分成四组,问能否拼成正方形 

思路:搜索思路很简单但是剪枝不好剪

所得:都注释在代码了

[code]#include<cstdio>
#include<algorithm>
using namespace std;
int aver,n,flag,sum;
int book[21],a[21];
int DFS(int num,int len,int st)//num表示已经拼出来几条边,len表示正在拼的长度
//st是剪枝关键之后再说
{
if(num==3)   //如果已经拼出来三条边,剩下的自然能够拼成第四条
{
return 1;
}
if(len==aver)//如果拼出来一条边
{
if(DFS(num+1,0,0)) //因为要重新拼出来一条边,所以需要从头开始搜索
//标记归0
return 1;
}
for(int i=st;i<=n;i++)
{
if(book[i]==0&&len+a[i]<=aver)   //用book数组记录已经使用过的木棍
{
book[i]=1;
if(DFS(num,len+a[i],i+1)) //因为对前面的排查已经做过了
//用过的已经被标记,用不了的也不能用了
//再从头扫一遍就会浪费时间,所以保存这个标记
//下层循环从标记处开始就能够省去很多时间
return 1;
book[i]=0;
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
sum=0;
int max=-1;
for(int i=1;i<=n;i++)
{
book[i]=0;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(a[i]>max)
max=a[i];
}
aver=sum/4;
if(max>aver||sum%4!=0)
{
printf("no\n");
continue;
}
if(DFS(0,0,1))
printf("yes\n");
else
printf("no\n");
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: