1.一步之遥
#include <iostream>
using namespace std;
int main()
{
int step=0,now=0;
while(now!=1){
if(now>1)now-=127;
else if(now<1)now +=97;
step++;
}
printf("%d",step);
return 0;
}
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int,int>PII;
#define x first
#define y second
queue<PII>q;
int bfs(){
q.push({0,0});
while(!q.empty()){
PII t=q.front();
q.pop();
int dx=t.x;
int dy=t.y;
//printf("x==%d,y==%d\n",dx,dy);
if(dx-127==1||dx+97==1)return dy+1;
if(dx>1)q.push({dx-127,dy+1});
else q.push({dx+97,dy+1});
}
return 0x3f3f3f3f;
}
int main()
{
printf("%d",bfs());
return 0;
}
2.回路计数
dfs 超时
状压不会QAQ
#include <iostream>
#include <vector>
using namespace std;
bool st[22];
long long ans;
//vector<int>num;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
void dfs(int step,int now){
if(step==21){
ans++;
// for(int i=0;i<21;i++){
// printf("%d ",num[i]);
// }
// puts("");
return;
}
for(int i=1;i<=21;i++){
if(!st[i]&&gcd(i,now)==1){
st[i]=true;
//num.push_back(i);
dfs(step+1,i);
//num.pop_back();
st[i]=false;
}
}
}
int main()
{
dfs(0,0);
printf("%lld",ans);
return 0;
}
3.方格分割
dfs
#include <iostream>
using namespace std;
const int N=8;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool st[N][N];
long long ans;
void dfs(int x,int y){
if(x==0||x==6||y==0||y==6){
ans++;
return;
}
for(int i=0;i<4;i++){
int mx=x+dx[i],my=y+dy[i];
if(!st[mx][my]&&mx>=0&&mx<=6&&my>=0&&my<=6){
st[mx][my]=true;
st[6-mx][6-my]=true;
dfs(mx,my);
st[mx][my]=false;
st[6-mx][6-my]=false;
}
}
}
int main(){
st[3][3]=true;
dfs(3,3);
printf("%lld",ans/4);
return 0;
}
4.棋盘多项式
dfs 按连通块按行搜
#include <iostream>
#include <cstring>
using namespace std;
const int N=10;
int mp[N][N];
int vis[N][N];
int ans,n;
bool check(int x,int y){
//从上一行查起
for(int i=x-1;i>=0;i--){
if(vis[i][y])return false;//遇到车
if(mp[i][y]==0)return true;//遇到洞
}
return true;
}
void dfs(int x,int y,int bound,int sum){
if(sum>=bound){ans++; return;}
if(y>=n){x++;y=0;}
if(x>=n){return;}
int l=y,r=y;
for(;r < n;r ++) if(!mp[x][r]) break; // 找到洞了
//选
for(int i=l;i<r;i++){
if(check(x,i)){
vis[x][i]=1;
dfs(x,r+1,bound,sum+1);
vis[x][i]=0;
}
}
//不选
dfs(x,r+1,bound,sum);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n*n;i++){
ans=0;
memset(vis,0,sizeof vis);
dfs(0,0,i,0);
if(ans==0)break;
cout<<ans<<endl;
}
return 0;
}