1、2n皇后问题
本题思路是:先把黑皇后摆完,然后去摆白皇后,如果白皇后在限制条件下能够摆放成功,则答案+1;记录一种成功方案后进行回溯。
限制条件:
1.同色棋子不同行、对角线;
2.不同色棋子不能在同一个格子。
#include <bits/stdc++.h>
using namespace std;
int n, mapp[10][10];
int ans, rem_b[10], rem_w[10]; //rem函数用来记录第x行的棋子的y坐标
bool check_black(int x, int y)
{
if (mapp[x][y] == 0)
return false;
for (int i = 1; i < x; i++)
{
if (rem_b[i] == y || abs(i - x) == abs(rem_b[i] - y)) //同格 || 在同一条对角线(画图推导一下即可得知该关系)
return false;
}
return true;
}
bool check_white(int x, int y)
{
if (mapp[x][y] == 0)
return false;
for (int i = 1; i < x; i++)
{
if (rem_w[i] == y || abs(i - x) == abs(rem_w[i] - y))
return false;
}
return true;
}
void dfs_white(int x)
{
if (x == n + 1)
{
ans++;
return;
}
for (int i = 1; i <= n; i++)
{
if (check_white(x, i))
{
mapp[x][i] = 0;
rem_w[x] = i;
dfs_white(x + 1);
mapp[x][i] = 1;
rem_w[x] = 0;
}
}
}
void dfs_black(int x)
{
if (x == n + 1) //先摆黑子,完事了开始摆白子
{
dfs_white(1);
return;
}
for (int i = 1; i <= n; i++)
{
if (check_black(x, i))
{
mapp[x][i] = 0;
rem_b[x] = i;
dfs_black(x + 1);
mapp[x][i] = 1;
rem_b[x] = 0;
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> mapp[i][j];
dfs_black(1);
cout << ans << endl;
//system("pause");
return 0;
}
2、字母图形
这题规律见代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
string s;
char x = 'A';
for(int i = 0; i < m; i++)
{
s += x++;
}
cout<<s<<endl;//一行一行输出
for(int i = 1; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(j <= i-1)//在下三角的话是递增(不含对角线)
s[j] = s[j]+1;
else //在上三角递减
s[j] = s[j]-1;
}
cout<<s<<endl;
}
return 0;
}
3、求1000!
当我看到可以用python时,一下笑出声:
n = int(input())
sum = 1
for i in range(1,n+1): #注意要乘到n写n+1
sum = sum*i
print(sum)
过了但又怕它说我“年轻人不讲武德”,于是:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3005;//最大1000! 假设1000个1000相乘 1后面3000个0 多加4位防止溢出
int main()
{
int a[maxn];
int n, c, sum;
memset(a, 0, sizeof(a));
cin >> n;
a[0] = 1;
for (int i = 2; i <= n; i++)//从2乘到n
{
c = 0;//个位之前没有进位
for (int j = 0; j < maxn; j++)//从第一位开始
{
sum = a[j] * i + c;//一位和=数字的一位*阶乘数+进位
a[j] = sum % 10;//用数组的一位去保存数字的一位,
c = sum / 10;//保留进位
}
}//处理之后,数字的每一位都保留在数组上了,只是用不完的数组数(高位)都以0代替 如:
//2!=2 a[0]=2; a[1] a[2]...=0;
int l;
for ( l = maxn - 1; l > -1; l--)
{
if (a[l] != 0)//从最高位开始到不为0的位 跳出
break;
}
for (int k = l; k >=0; k--)
{
if (k != 0)
cout << a[k];
else
cout << a[k] << endl;
}
return 0;
}
4、报时助手
这题单纯犹豫感觉很有趣,而且这个写法比较方便所以放上来。
用pair把表打好,再用map输出:
#include <bits/stdc++.h>
using namespace std;
int n,m;
pair<int,string>out[]={
{0,"zero"},{1, "one"}, {2,"two"}, {3,"three"},
{4,"four"}, {5,"five"}, {6,"six"},{7,"seven"}, {8,"eight"}, {9,"nine"},
{10,"ten"}, {11,"eleven"}, {12,"twelve"}, {13,"thirteen"}, {14,"fourteen"},
{15,"fifteen"}, {16,"sixteen"},{17,"seventeen"}, {18,"eighteen"},
{19,"nineteen"}, {20,"twenty"},{30,"thirty"},{40,"forty"},
{50,"fifty"},{60,"sixty"}
};
map<int,string>h;
int main()
{
for(int i=0;i<=24;i++)
h[out[i].first]=out[i].second;
cin>>n>>m;
if(n>20)
cout<<h[20]<<" "<<h[n%10]<<" ";
else
cout<<h[n]<<" ";
if(m==0)
puts("o'clock");
else
{
if(m>20)
{
int t=m%10;
m -= t;
cout<<h[m];
if(t!=0)
cout<<" "<<h[t];
}
else
cout<<h[m];
}
return 0;
}