1.带分数
#include<iostream>
using namespace std;
const int M = 9;
int n,ans,a[M+5];
void swap(int x,int y){int t=a[x];a[x]=a[y];a[y]=t;}
int pow(int x,int y){if(!y)return 1;return x*pow(x,y-1);}
void sort(int x,int y){
for(int i=x;i<y;i++)
for(int j=i+1;j<=y;j++)
if(a[i]>a[j])swap(i,j);
}
void ask(){
int x=0,y=0;
for(int i=1;i<=M;i++)y = y*10+a[i];
for(int i=1;i<M-1;i++){
x = x*10+a[i];
if(x>=n)break;
int t = y%pow(10,M-i);
int z = 0;
for(int j=M-1;j>i;j--){
t /= 10;
z = z*10+a[j+1];
if(t<z)break;
if(t%z)continue;
if(x + t/z == n){
//cout<<x<<'+'<<t<<'/'<<z<<endl;
//for(int T=1;T<=M;T++)cout<<a[T];cout<<endl;
ans++;
break;
}
}
}//闅旀澘娉?
return;
}
void Search(){
ask();
//for(int i=1;i<=M;i++)cout<<a[i];cout<<endl;
for(int i=M-1;i>0;i--)if(a[i]<a[i+1]){
for(int j=M;j>i;j--)if(a[i]<a[j]){
swap(i,j);
sort(i+1,M);
Search();
return;
}
}
return;
}
int main(){
for(int i=1;i<=M;i++)a[i]=i;
cin>>n;
Search();
cout<<ans;
return 0;
}
2.李白打酒
#include<iostream>
using namespace std;
int dp(int a,int b,int n){
if(!a&&b==n)return 1;
if(n==0||b==0)return 0;
int t=0;
if(a)t+=dp(a-1,b,n*2);
if(b)t+=dp(a,b-1,n-1);
return t;
}
int main(){
cout<<dp(5,10,2);
return 0;
}
3.第三十九级台阶
#include<iostream>
using namespace std;
int dp[40][2];
int search(int a,bool b){ //a涓哄彴闃舵暟,b涓哄乏鍙宠剼
if(dp[a][b]||a<2)return dp[a][b];
return dp[a][b] = search(a-1,b^1) + search(a-2,b^1);
}
int main(){
dp[1][0]=d[2][0]=1;
cout << search(39,1);
return 0;
}
4.跨越雷区
#include<iostream>
#include<queue>
using namespace std;
const int M = 100;
const int INF = 99999;
const int X[4] = {-1,0,1,0};
const int Y[4] = {0,-1,0,1};
int n;
int endx,endy;
char ch[M+5][M+5];
int a[M+5][M+5];
struct Coordinate{
int x,y;
Coordinate(int x,int y):x(x),y(y){}
};
queue<Coordinate>q;
void bfs(){
Coordinate t = q.front();
q.pop();
//cout<<t.x<<' '<<t.y<<endl;
for(int i=0;i<4;i++){
int tx = t.x + X[i] , ty = t.y + Y[i];
if(tx<1||ty<1||tx>n||ty>n||a[tx][ty]||ch[tx][ty]==ch[t.x][t.y])continue;
q.push(Coordinate(tx,ty));
a[tx][ty] = a[t.x][t.y] + 1;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
cin>>ch[i][j];
if(ch[i][j]=='A'){
q.push(Coordinate(i,j));
a[i][j]=1;
}
if(ch[i][j]=='B')endx = i,endy = j;
}
while(!q.empty())bfs();
cout << a[endx][endy]-1;
return 0;
}
5.迷宫
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
const int X[4] = {1,0,0,-1};
const int Y[4] = {0,-1,1,0};
const string S[4] = {"D","L","R","U"};
bool a[31][51];
struct Coordinate{
int x,y;
string s;
Coordinate(int x,int y,string s):x(x),y(y),s(s){}
};
queue<Coordinate> q;
void bfs(){
Coordinate t = q.front();
q.pop();
for(int i=0;i<4;i++){
int tx = t.x + X[i];
int ty = t.y + Y[i];
if(tx<1||tx>30||ty<1||ty>50||a[tx][ty])continue;
string ts = t.s + S[i];
if(tx==30&&ty==50){
while(!q.empty())q.pop();
cout<<ts;
return;
}
a[tx][ty]=true;
q.push(Coordinate(tx,ty,ts));
}
}
int main(){
for(int i=1;i<=30;i++)for(int j=1;j<=50;j++){
char ch;
cin>>ch;
a[i][j] = (ch=='1');
}
q.push(Coordinate(1,1,""));
while(!q.empty())bfs();
return 0;
}
6.跳马
#include<iostream>
#include<queue>
using namespace std;
const int X[8] = {-2,-2,-1,-1,1,1,2,2};
const int Y[8] = {-1,1,-2,2,-2,2,-1,1};
int board[9][9];
struct Coordinate{
int x,y,p;
Coordinate(int x,int y,int p):x(x),y(y),p(p){}
};
queue<Coordinate> q;
void bfs(){
Coordinate t = q.front();
q.pop();
for(int i=0;i<8;i++){
int tx = t.x + X[i];
int ty = t.y + Y[i];
if(tx<1||tx>8||ty<1||ty>8||board[tx][ty])continue;
board[tx][ty] = t.p + 1;
q.push(Coordinate(tx,ty,board[tx][ty]));
}
}
int main(){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
board[x1][y1] = 1;
q.push(Coordinate(x1,y1,1));
bfs();
cout<<board[x2][y2]-1<<endl;
return 0;
}
7.路径之谜
#include<iostream>
using namespace std;
const int X[4] = {1,-1,0,0};
const int Y[4] = {0,0,1,-1};
int n,a[21],b[21];
bool bo[21][21];
int st[401],p=0; //鎵嬪姩妯℃嫙鏍?<stack>搴撹兘涓嶇敤灏变笉鐢?
bool dfs(int x,int y){
if(!a[y]||!b[x])return false;
a[y]--,b[x]--;
if(x==n&&y==n){
bool bo = true;
for(int i=1;i<=n;i++)if(a[i]||b[i])bo = false;
if(bo){
st[p++] = (x-1)*n+y-1;
return true;
}
}
for(int i=0;i<4;i++){
int tx = x + X[i];
int ty = y + Y[i];
if(tx<1||tx>n||ty<1||ty>n)continue;
if(dfs(tx,ty)){
st[p++] = (x-1)*n+y-1;
return true;
}
}
a[y]++,b[x]++;
return false;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
dfs(1,1);
cout<<0;
for(int i=p-2;i>=0;i--)cout<<' '<<st[i];
return 0;
}
8.未名湖边的烦恼
#include<iostream>
using namespace std;
int m,n,p; //p琛ㄧず姝ゆ椂杩樺墿澶氬皯鍐伴瀷
int dfs(int x){ //x琛ㄧず杩樺墿澶氬皯浜?
if(!m)return 1;
int t=0;
if(m){
m--,p++;
t += dfs(x-1);
m++,p--;
}
if(n&&p){
n--,p--;
t += dfs(x-1);
n++,p++;
}
return t;
}
int main(){
cin>>m>>n;
cout<< ((m<n)?0:dfs(m+n));
return 0;
}
9.大臣的旅费
//ps:姝ら鐢╠fs绠楁硶鍙兘鍦∣nlineJudge涓婂緱60鍒?瓒呮椂)
// 浣嗕簨瀹炰笂搴旇婊¤冻浜嗙幇闃舵鐨勯渶姹?
// 寤鸿鐢ㄦ爲鐨勬€濈淮鍘昏В鍐?绗旇€呰刀鏃堕棿,涓嶅啓婊″垎瑙d簡
#include<iostream>
#include<vector>
using namespace std;
const int M = 900000;
int max(int x,int y){return x<y?y:x;}
int n,ans;
struct DOUBLE{
int x;
int y;
DOUBLE(int x,int y):x(x),y(y){}
};
vector<DOUBLE> v[M+1];
bool bo[M+1];
int dfs(int x){
bo[x] = true;
int t = 0;
for(int i=0;i<v[x].capacity();i++){
if(bo[v[x][i].x])continue;
t = max(t,v[x][i].y + dfs(v[x][i].x));
}
bo[x] = false;
return t;
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y,z;
cin>>x>>y>>z;
v[x].push_back(DOUBLE(y,z));
v[y].push_back(DOUBLE(x,z));
}
for(int i=1;i<=n;i++)if(v[i].capacity()==1)ans=max(ans,dfs(i));
cout<< ans*(ans+21)/2;
return 0;
}
10.皇后问题
//杩欐槸浠庣綉涓婃憳鐨勪唬鐮?
#include<cstdio>
#include<cstring>
int a[9][9],vis1[9],vis2[9],cnt,n;
int x1[19],x2[19],y1[19],y2[19];
void DFS(int dep)
{
if(dep==n+1) { cnt++; return ;}
for(int i=1;i<=n;i++)
{
if(!vis1[i] && a[dep][i] && !x1[dep+i] && !y1[dep-i+n])
{
vis1[i]=1; a[dep][i]=0; x1[dep+i]=1; y1[dep-i+n]=1;
for(int j=1;j<=n;j++)
{
if(!vis2[j] && a[dep][j] && !x2[dep+j] && !y2[dep-j+n])
{
vis2[j]=1;a[dep][j]=0; x2[dep+j]=1; y2[dep-j+n]=1;
DFS(dep+1);
vis2[j]=0;a[dep][j]=1; x2[dep+j]=0; y2[dep-j+n]=0;
}
}
vis1[i]=0; a[dep][i]=1; x1[dep+i]=0; y1[dep-i+n]=0;
}
}
}
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
DFS(1);
printf("%d",cnt);
return 0;
}