2019.8.30做的三道题
2019.8.30做的三道题
Mayan游戏
没啥好说的,看着就恶心,还好有大佬的题解指导要不然我就废废废了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdlib>
const int maxn=10;
using namespace std;
int read()
{
int X=0,w=0; char ch=0;
while(!isdigit(ch))
{
w|=ch=='-';ch=getchar();
}
while(isdigit(ch))
X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
int n,map[maxn][maxn],ans[maxn][5],last[maxn][maxn][maxn],xiao[maxn][maxn];
bool remove()
{
int flag=0;
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
{
if(i-1>=1&&i+1<=5&&map[i][j]==map[i-1][j]&&map[i][j]==map[i+1][j]&&map[i][j])
{
xiao[i-1][j]=1;
xiao[i+1][j]=1;
xiao[i][j]=1;
flag=1;
}
if(j-1>=1&&j+1<=7&&map[i][j]==map[i][j+1]&&map[i][j]==map[i][j-1]&&map[i][j])
{
xiao[i][j]=1;
xiao[i][j+1]=1;
xiao[i][j-1]=1;
flag=1;
}
}
if(!flag)
return 0;
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
if(xiao[i][j])
{
xiao[i][j]=0;
map[i][j]=0;
}
return 1;
}
bool check()
{
for(int i=1;i<=5;i++)
if(map[i][1])
return 0;
return 1;
}
void copy(int x)
{
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
last[x][i][j]=map[i][j];
}
void update()
{
for(int i=1;i<=5;i++)
{
int wow=0;
for(int j=1;j<=7;j++)
{
if(!map[i][j])
wow++;
else
{
if(!wow)
continue;
map[i][j-wow]=map[i][j];
map[i][j]=0;
}
}
}
}
void move(int i,int j,int x)
{
int tmp=map[i][j];
map[i][j]=map[i+x][j];
map[i+x][j]=tmp;
update();
while(remove())
update();
}
void dfs(int x)
{
if(check())
{
for(int i=1;i<=n;i++)
{
if(i!=1)printf("\n");
for(int j=1;j<=3;j++)
printf("%d ",ans[i][j]);
}
exit(0);
}
if(x==n+1)
return;
copy(x);
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
{
if(map[i][j])
{
if(i+1<=5&&map[i][j]!=map[i+1][j])
{
move(i,j,1);
ans[x][1]=i-1;
ans[x][2]=j-1;
ans[x][3]=1;
dfs(x+1);
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
map[i][j]=last[x][i][j];
ans[x][1]=-1;
ans[x][2]=-1;
ans[x][3]=-1;
}
if(i-1>=1&&map[i-1][j]==0)
{
move(i,j,-1);
ans[x][1]=i-1;
ans[x][2]=j-1;
ans[x][3]=-1;
dfs(x+1);
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
map[i][j]=last[x][i][j];
ans[x][1]=-1;
ans[x][2]=-1;
ans[x][3]=-1;
}
}
}
}
int main()
{
n=read();
for(int i=1;i<=5;i++)
{
for(int j=1;j<=8;j++)
{
int x=read();
if(x==0)
break;
map[i][j]=x;
}
}
memset(ans,-1,sizeof(ans));
dfs(1);
puts("-1");
return 0;
}
n皇后问题
经典的一道dfs回溯题目,比较简单
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=20;
int n;
char ans[maxn][maxn];
bool h[maxn],dj[maxn],fdj[maxn];
void init()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
ans[i][j]='.';
}
}
void dfs(int u)
{
if(u==n)
{
for(int i=0;i<n;i++)
cout<<ans[i]<<endl;
cout<<endl;
return ;
}
for(int i=0;i<n;i++)
{
if(!h[i]&&!dj[u+i]&&!fdj[n-u+i])
{
ans[u][i]='Q';
h[i]=dj[u+i]=fdj[n-u+i]=true;
dfs(u+1);
h[i]=dj[u+i]=fdj[n-u+i]=false;
ans[u][i]='.';
}
}
}
int main()
{
cin>>n;
init();
dfs(0);
return 0;
}
导弹防御系统
刷新了我的三观,可能是因为我太菜了??
多亏了yxc大佬
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=50;
int n;
int h[maxn];
int up[maxn],down[maxn];
bool dfs(int u,int su,int sd,int depth)
{
if(su+sd>depth)
return false;
if(u==n)//到达就好
return true;
bool flag=true;
for(int i=1;i<=su;i++)
{
if(up[i]<h[u])
{
int t=up[i];
up[i]=h[u];
if(dfs(u+1,su,sd,depth))
return true;
up[i]=t;//还原现场
flag=false;
break;
}
}
if(flag)
{
up[su+1]=h[u];
if(dfs(u+1,su+1,sd,depth))
return true;
}
flag=true;
for(int i=1;i<=sd;i++)
{
if(down[i]>h[u])
{
int t=down[i];
down[i]=h[u];
if(dfs(u+1,su,sd,depth))
return true;
down[i]=t;//还原现场2
flag=false;
break;
}
}
if(flag)
{
down[sd+1]=h[u];
if(dfs(u+1,su,sd+1,depth))
return true;
}
return false;
}
int main()
{
while(cin>>n&&n)//循环输入
{
for(int i=0;i<n;i++)
cin>>h[i];
int depth=0;
while(!dfs(0,0,0,depth))//迭代加深
depth++;
cout<<depth<<endl;
}
return 0;
}
总结
这三道题都是比较经典的搜索题,我现在目前在死磕搜索、,一定要弄懂,弄会,弄明白,这样才能从量变走向质变(我才不要变质)
本博文为wweiyi原创,若想转载请联系作者,qq:2844938982