重写棋盘
#include<stdio.h>
#include<string.h>
char a[100][100];
int b[100];
int ans,n,k; 局部的循环变量就不要放在全局变量的地方了
void dfs(int t,int y)
int i,j;
if(y>=k)
{
ans++;
return;
}
for(i=t;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='#'&&b[j]==0)
{
b[j]=1;
dfs(i+1,y+1); //注意了在这里错两遍了,下一个dfs是i+1不要脑残不要手误
b[j]=0;
}
}
}
return;
}
int main(void)
{
int l;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1&&k==-1)
break;
ans=0;
memset(b,0,sizeof(b));memset(a,'\0',sizeof(a));
for(l=0;l<n;l++)
{
scanf("%s",a[l]);
}
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
重写抓牛
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int n,k;
int vis[100010];
int bfs(int t)
{
memset(vis,-1,sizeof(vis)); 记住memset只能0,-1
queue<int> que;
que.push(t);
vis[t]=0;
while(que.size())
{
int num=que.front();que.pop(); ///注意bfs这里要退队
if(num==k)
{
break;
}
else
{
if(num-1>=0&&vis[num-1]==-1)
{
vis[num-1]=vis[num]+1;que.push(num-1); 注意这里要加队
}
if(num+1<=100000&&vis[num+1]==-1)
{
vis[num+1]=vis[num]+1;que.push(num+1);
}
if(num*2<=100000&&vis[num*2]==-1) /是小于等于
{
vis[num*2]=vis[num]+1;que.push(num*2);
}
}
}
return vis[k];
}
int main(void)
{
while(scanf("%d%d", &n, &k)!=EOF)
{
printf("%d\n",bfs(n));
}
return 0;
}