代码:
#include
using namespace std;
int main(){
int n, ans = 0;
cin >> n;
while(n){
ans += n % 10;
n /= 10;
}
cout << ans << endl;
return 0;
}
代码:
#include
using namespace std;
const int MAXN = 50;
int g[MAXN][MAXN], ans[MAXN][MAXN];
int main(){
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
cin >> g[i][j];
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++){
//向x方向扩展
int le = j, ri = j;
while(le > 0 && g[i][le - 1] == g[i][j])
-- le;
while(ri < m - 1 && g[i][ri + 1] == g[i][j])
++ ri;
if(ri - le + 1 >= 3){
ans[i][j] = 1;
continue;
}
//向y方向扩展
le = i, ri = i;
while(le > 0 && g[le - 1][j] == g[i][j])
-- le;
while(ri < n - 1 && g[ri + 1][j] == g[i][j])
++ ri;
if(ri - le + 1 >= 3)
ans[i][j] = 1;
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
if(ans[i][j])
cout << "0 ";
else
cout << g[i][j] << " ";
}
cout << endl;
}
return 0;
}
..____.____..____..____...___..
./.___/.___||.._.\|.._.\./._.\.
|.|...\___.\|.|_).|.|_).|.|.|.|
|.|___.___).|..__/|.._.<|.|_|.|
.\____|____/|_|...|_|.\_\\___/.
本题要求编程实现一个用 ASCII 字符来画图的程序,支持以下两种操作:
画线:给出两个端点的坐标,画一条连接这两个端点的线段。简便起见题目保证要画的每条线段都是水平或者竖直的。水平线段用字符 - 来画,竖直线段用字符 | 来画。如果一条水平线段和一条竖直线段在某个位置相交,则相交位置用字符 + 代替。
填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。注意这里的相邻位置只需要考虑上下左右 4 个方向,如下图所示,字符 @ 只和 4 个字符 * 相邻。
.*.
*@*
.*.
输入格式
第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。
第2行至第q + 1行,每行是以下两种形式之一:
0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2。
1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。
输出格式
输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。
样例输入
4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A
样例输出
AAAA
A–A
样例输入
16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C
样例输出
................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................
评测用例规模与约定
所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。
题解:
注意本题的坐标系和数组坐标系不一样,需要转换一下,若本题输入的坐标为 a , b , 则数组坐标为 n - 1 - b , a ,使用dfs来模拟上色的过程。
代码:
#include
#include
#include
using namespace std;
const int MAXN = 110;
char g[MAXN][MAXN];
bool vis[MAXN][MAXN];
int fx[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}, n, m;
void dfs(int r, int c, char ch){
vis[r][c] = true;
g[r][c] = ch;
for(int i = 0; i < 4; i ++){
int newr = r + fx[i][0];
int newc = c + fx[i][1];
if(newr >= 0 && newr < n && newc >= 0 && newc < m && g[newr][newc] != '|' && g[newr][newc] != '-' && g[newr][newc] != '+' && !vis[newr][newc])
dfs(newr, newc, ch);
}
}
int main(){
int q, a, b, c, d;
char ch;
cin >> m >> n >> q;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
g[i][j] = '.';
while(q --){
cin >> a;
if(a == 0){
cin >> b >> a >> d >> c;
//转换坐标
a = n - 1 - a;
c = n - 1 - c;
//行相等
if(a == c){
if(b > d)
swap(b, d);
for(int i = b; i <= d; i ++)
if(g[a][i] == '|' || g[a][i] == '+')
g[a][i] = '+';
else
g[a][i] = '-';
}else{ //列相等
if(a > c)
swap(a, c);
for(int i = a; i <= c; i ++)
if(g[i][b] == '-'|| g[i][b] == '+')
g[i][b] = '+';
else
g[i][b] = '|';
}
}else{
cin >> b >> a >> ch;
a = n - 1 - a;
memset(vis, false, sizeof(vis));
dfs(a, b, ch);
}
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++)
cout << g[i][j];
cout << endl;
}
return 0;
}
代码:
#include
#include
using namespace std;
const int MAXN = 10010;
set<int> g[MAXN];
int ans[10 * MAXN], pre[MAXN], top = 0;
//并查集判定连通性
int find(int a){
return a == pre[a] ? a : pre[a] = find(pre[a]);
}
void dfs(int u)
{
while (g[u].size())
{
int t = *g[u].begin();
g[u].erase(t), g[t].erase(u);
dfs(t);
}
ans[ ++ top] = u;
}
int main(){
int n, m, cnt = 0, a, b;
bool op = true;
cin >> n >> m;
for(int i = 1; i <= n; i ++)
pre[i] = i;
for(int i = 0; i < m; i ++){
cin >> a >> b;
g[a].insert(b);
g[b].insert(a);
pre[find(a)] = pre[find(b)];
}
for(int i = 1; i <= n; i ++){
if(find(i) != find(1)){
op = false;
break;
}
if(g[i].size() & 1)
++ cnt;
}
//欧拉路径判定
if(!op || !(cnt == 0 || (cnt == 2 && g[1].size() & 1)))
cout << -1 << endl;
else{
dfs(1);
for(int i = top; i; i --)
cout << ans[i] << " ";
}
return 0;
}
贴上一道大神的70分代码,源代码:https://www.acwing.com/activity/content/code/content/886899/
代码:
#include
#include
#include
#include
using namespace std;
const int N = 1010;
int m, n;
char str[N];
bitset<1000> v[30][1000], h[30][1000], b;
void mul(int z, int x, int y)
{
for (int i = 0; i < m; i ++ )
for (int j = 0; j < m; j ++ )
v[z][i][j] = h[z][j][i] = (v[x][i] & h[y][j]).count() & 1;
}
void mul(bitset<1000>& res, int x)
{
bitset<1000> tmp;
for (int i = 0; i < m; i ++ )
tmp[i] = (v[x][i] & res).count() & 1;
res = tmp;
}
void qmi(int k)
{
bitset<1000> res = b;
for (int i = 0; k; k >>= 1, i ++ )
if (k & 1)
mul(res, i);
for (int i = 0; i < m; i ++ )
printf("%d", !!res[i]);
puts("");
}
int main()
{
scanf("%d", &m);
for (int i = 0; i < m; i ++ )
{
scanf("%s", str);
for (int j = 0; j < m; j ++ )
if (str[j] == '1')
{
v[0][i][j] = 1;
h[0][j][i] = 1;
}
}
scanf("%s", str);
for (int i = 0; i < m; i ++ )
if (str[i] == '1')
b[i] = 1;
for (int i = 1; i < 30; i ++ ) mul(i, i - 1, i - 1);
scanf("%d", &n);
while (n -- )
{
int k;
scanf("%d", &k);
qmi(k);
}
return 0;
}