public class 带分数 {
/**
* n= a + b/c
*/
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=Integer.parseInt(scanner.nextLine());
long t1=System.currentTimeMillis();
String[] arr=new String[]{"1","2","3","4","5","6","7","8","9"};
int t=0;
int conut=0;
String string="";
for (int i = 1; i < n; i++) {
for (int j = 2; j < 10000; j++) {
t=(n-i)*j;
string=""+i+j+t;
if(string.length()!=9){
continue;
}else {
boolean fa=false;
for (int k = 0; k < arr.length; k++) {
int index=string.indexOf(arr[k]);
if(index==-1){
fa=false;
break;
}
fa=true;
}
if(fa){
conut++;
}
}
}
}
System.out.println(conut);
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
}
#include <stdio.h>
int num = 0;
void f(int flower,int store,int sum) //flower记录遇到花的次数,store记录遇到店的次数,
// sum为当前酒的总数
{
if(flower>9 || store>5) // 判断递归的出口对于递归来说十分关键
return;
if(flower==9 && store==5) //由题意最后一次肯定为花,因此在倒数第二次时的情况为
//经过9次花,5次店,并且剩下了一斗酒sum=1
{
if(sum==1)
{
num++;
return;
}
else
return;
}
f(flower+1,store,sum-1); //遇花喝一斗,即sum-1
f(flower,store+1,sum*2); //遇店多一倍,即sum*2
}
int main ()
{
f(0,0,2); //初次递归的初始条件
printf("%d",num);
return 0;
}
3. 第 39 级台阶
51167078
using namespace std;
const int N=110;
char a[N][N];
int book[N][N];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
struct node{
int x;
int y;
char c;
int step;
}first;
int n;
int bfs(node first)
{
queue<node>q;
q.push(first);
while(!q.empty())
{
node now=q.front();
if(now.c=='B')
{
return now.step;
}
q.pop();
for(int i=0;i<4;i++)
{
int nx=now.x+dx[i];
int ny=now.y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&a[nx][ny]!=a[now.x][now.y]&&!book[nx][ny])
{
book[nx][ny]=1;
node next;
next.x=nx;
next.y=ny;
next.c=a[nx][ny];
next.step=now.step+1;
q.push(next);
}
}
}
return -1;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
if(a[i][j]=='A')
{
first.x=i;
first.y=j;
first.c='A';
first.step=0;
}
}
}
cout<<bfs(first)<<endl;
return 0;
}
6. 跳马
int n , m ,ans ;
int dx[4] = {1,2,2,1} ;
int dy[4] = {2,1,-1,-2} ;
void dfs(int x ,int y)
{
if(x == m && y == n)
{
ans ++ ;
}
int i ;
int tx = 0 ;
int ty = 0 ;
for (i = 0 ; i< 4 ;i++)
{
tx = x + dx[i] ;
ty = y + dy[i] ;
if(tx >m || tx <0 || ty >n || ty<0)
continue ;
else
{
dfs(tx,ty);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
dfs(0,0);
printf("%d",ans);
return 0 ;
}
package Lqb;
public class Text5 {
static String lx=""; //路线
final static int N=4; //方格大小
public static void main(String[] args) {
int[] top={2,4,3,4}; //上靶
int[] left={4,3,3,3}; //左靶
int[][] from=new int[N][N]; //方格
String[] strArray={""}; //记录路线i,j坐标
//初始化二维数组
int num=0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
from[i][j]=num++;
}
}
//
permute(from,0,0,strArray);
}
public static void permute(int[][] from,int X,int Y,String[] strArray) {
if(X==N-1&&Y==N-1){
System.out.print(lx);
}
for(int i=X;i<N;i++){
for(int j=Y;j<N;j++){
lx=lx+from[i][j];
swap(from,i,j,strArray);
}
}
}
//分叉可能路线
public static void swap(int[][] from,int X,int Y,String[] strArray) {
if(ifss(X--,Y,strArray)){
permute(from,X,Y,strArray);
X++;
}
if(ifss(X++,Y,strArray)){
permute(from,X,Y,strArray);
X--;
}
if(ifss(X,Y--,strArray)){
permute(from,X,Y,strArray);
Y++;
}
if(ifss(X,Y++,strArray)){
permute(from,X,Y,strArray);
Y--;
}
if(ifss(X--,Y--,strArray)){
permute(from,X,Y,strArray);
X++;
Y++;
}
if(ifss(X--,Y++,strArray)){
permute(from,X,Y,strArray);
X++;
Y--;
}
if(ifss(X++,Y++,strArray)){
permute(from,X,Y,strArray);
X--;
Y--;
}
if(ifss(X++,Y--,strArray)){
permute(from,X,Y,strArray);
X--;
Y++;
}
}
//判断路线是否走过
public static boolean ifss(int X,int Y,String[] strArray) {
for(int i=0;i<strArray.length;i++){
if(strArray[i].equalsIgnoreCase(X+""+Y)){
return false;
}
}
return true;
}
}
int fun(int n,int m)
{
if(n<m) return 0;
if(m==0) return 1;
return fun(n-1,m)+fun(n,m-1);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
printf("%d\n",fun(n,m));
return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
using namespace std;
struct node{
int v;
int w;
node(int a,int b){v=a;w=b;}
};
const int maxn=200000;
vector<node> g[maxn];
bool vis[maxn]={false};
int n,p,q,d;
int ans,to;//距离(千米数),to为任意点能到的最远点
void dfs(int now,int dis)
{
if(dis > ans) //找到更远的距离,更新ans,更新to
{
ans=dis;
to=now;
}
for(int i=0;i<g[now].size();i++)
{
int v=g[now][i].v;
int w=g[now][i].w;
if(vis[v]==false) //没访问过,就去访问
{
vis[v]=1; //标记走过
dfs(v,dis+w); //更新dis的距离
vis[v]=0; //回溯
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n-1;i++)
{
cin>>p>>q>>d;
g[p].push_back(node(q,d)); //无向图
g[q].push_back(node(p,d));
}
vis[1]=1; //从1(首都)出发,可以任意一点
dfs(1,0); //dfs入口
memset(vis,0,sizeof(vis));
ans=0;
vis[to]=1; //从to出发
dfs(to,0);
cout<<ans*11+(ans*(ans-1))/2 ;
/* 求出距离ans后,第一米11,第二米12,为一个首项为11,公差为1的等差数
列,于是使用等差公式前n项和,Sn = n*a1 + n*(n-1)/2; */
return 0;
}
10. 2n 皇后问题
#include<iostream>
#include<algorithm>
using namespace std;
const int NUM = 51;
int pos[NUM][NUM]; // 可以防止皇后的位置
int x[NUM]; // 黑皇后的位置
int y[NUM]; // 白皇后的位置
int n;
int num = 0;
void Print() // 展示用处,上交时删掉
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (pos[i][j] == 1)
{
if (x[i] == j)
{
cout << "B ";
}
else if (y[i] == j)
{
cout << "W ";
}
else
{
cout << "X ";
}
}
else
{
cout << "0 ";
}
}
cout << endl;
}
for (int i = 1; i <= n; ++i)
{
cout << "- ";
}
cout << endl;
}
void Queen_2n(int r) // 表示递归到第r行
{
if (r == n + 1)
{
Print();
num++;
return;
}
for (int i = 1; i <= n; ++i) // 循环遍历,在第r行时皇后的位置
{
for (int j = 1; j <= n; ++j)
{
if (pos[r][i] == 1 && pos[r][j] == 1 && i != j) // 表示此位置可以安排皇后
{
bool flag = true;
x[r] = i;
y[r] = j;
for (int k = 1; k < r; ++k) // 遍历之前行,判断该位置是否可行
{
if (x[r] == x[k] || abs(k - r) == abs(x[k] - x[r]) || y[r] == y[k] || abs(k - r) == abs(y[k] - y[r]))
{
flag = false; // 不能同列,同对角线
break;
}
}
if (flag) // 如果皇后位置错误,不递归下一次
{
Queen_2n(r + 1); // 如果位置可以,找下一行
}
}
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> pos[i][j];
}
}
for (int i = 1; i <= n; ++i)
{
cout << "- ";
}
cout << endl;
Queen_2n(1);
cout << num << endl;
return 0;
}