本人NewOJ 672名的废物(实时更新)
QQ:1736491492 我写出来的题目都可以问我
文章目录
1250 方程整数解
暴力循环即可
1251 星系炸弹
依题意 三个变量y m d表示年月日
先用二维数组存进去每个月份的天数(共2+二十四钟月份天数)
然后过一天 n-- d ++ 判断m 和 d是不是合法的范围 进位
int main()
{
int y, m, d, n;
//二维数组表示 非闰年的每月天数,闰年的每月天数
int leap[2][13] = {0,31,28,31,30,31,30,31,31,30,31,30,31,
0,31,29,31,30,31,30,31,31,30,31,30,31};
while(cin >> y >> m >> d >> n) //输入年月日 以及每一天
{
while(n > 0)
{
//判断是不是闰年 是闰年t为1 不是则为0
int t = (y%4 == 0 && y%100 != 0) || y%400 == 0;
n --;
d ++;
if(d > leap[t][m]) //如果天数 超过了当前月份的天数 月份加1,天数置为1
{
d = 1;
m ++;
}
if(m == 13) //如果月份超过了 13 年数加1,月份置为1
{
m = 1;
y ++;
}
}
//输出格式要求
if(m < 10 && d < 10)
printf("%d-0%d-0%d\n",y,m,d);
else if(m < 10)
printf("%d-0%d-%d\n",y,m,d);
else if(d < 10)
printf("%d-%d-0%d\n",y,m,d);
else
printf("%d-%d-%d\n",y,m,d);
}
return 0;
}
1252 奇妙的数字(未写 周末补)
做题前估测是两位数
平方 四位数 立方 六位数
但是怎么暴力 我不太会简单方法
1253 牌型总数
1.枚举1~k每张牌的数量
十三个变量暴力
2.采用dfs深度优先搜索暴力的方法 也就是对总数量和总种类搜索
int ans;
void dfs(int cnt,int k) // 数量 种类
{
if(cnt == 13) //cnt = 13满足题意 答案加1
ans ++;
if(cnt == 13 || k == 13) //cnt = 13或 k也搜索完成 return;
return ;
for(int i = 0; i <= 4; i ++) //每张牌可以是0~4张
dfs(cnt+i, k+1);
}
int main()
{
dfs(0,0);
cout << ans << endl;
return 0;
}
1254 手链样式 (未写 周末补)
1255 饮料换购
模拟题
变量记录n/3 n%3
while(cin >> n){
int ans = n;
while(n>=3)
{
int a = n/3, b = n%3;
n = a+b;
ans += a;
}
cout << ans << endl;
}
1256 垒骰子 (未写 周末补)
dp+滚动数组
1257 灾后重建 (未写)
图论
1258 奖券数目
将五位数 每一位数存入数组
判断数组有没有4 即可
1259 三羊献瑞
用全排列next_permutation即可
int s[] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
do
{
int a = s[0]*10000+s[1]*1000+s[2]*100+s[3]*10+s[4];
int b = s[0]*1000+s[1]*100+s[6]*10+s[3];
int c = s[5]*1000+s[3]*100+s[2]*10+s[7];
if(s[0] != 0 && a == b + c)
cout << b << endl;
}while(next_permutation(s,s+10));
return 0;
}
1260 加法变乘法
变换题目的比如得:
(1+2+3+...+49)-10-11-27-28+10x11+27x28=2015
故只需找出两个整数x,y(x<y) 使得:
(1+2+3+...+49)-x-(x+1)-y-(y+1)+x*(x+1)+y*(y+1)=2015
枚举法 即可
for(int i = 1; i <= 49; i ++)
{
for(int j = i+2; j <= 49; j ++)
{
if(1225-2*i-1+i*(i+1)-2*j-1+j*(j+1) == 2015)
cout << i << endl;
}
}
1261 移动距离
算出编号的行、列 然后做减法即可
1262 生命之树
1263 打印大X
模拟题
可以观察出共有m行 每列有m+n-1个元素
采用bool数组 .存false *存true
int m, n;
while(cin >> m >> n)
{
for(int i = 0; i < (n-1)/2; i ++)
{
int l = i+1, r = m+n-l;
for(int j = 0; j < m; j ++) //依次赋值
{
a[l+j] = true;
a[r-j] = true;
}
for(int j = 1; j <= m+n-1; j ++)
{
if(a[j] == false) cout << ".";
else cout << "*";
a[j] = false; //复原
}
cout << endl;
}
for(int i = (n-1)/2; i < n; i ++)
{
int l = n-i, r = m+n-l;
for(int j = 0; j < m; j ++)
{
a[l+j] = true;
a[r-j] = true;
}
for(int j = 1; j <= m+n-1; j ++)
{
if(a[j] == false) cout << ".";
else cout << "*";
a[j] = false;
}
cout << endl;
}
}
1264 方格填数
总结下:只要是填数问题 都可以用全排列做
int d[] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
int ans = 0;
do
{
bool flag = true;
for(int i = 0; i <= 3; i ++) //使用排除法 用循环可以不用写出每一项小于
if(d[i] > d[i+1] || d[i] > d[i+5])
flag = false;
if(d[4] > d[9]) flag = false;
for(int i = 5; i <= 8; i ++)
if(d[i] > d[i+1])
flag = false;
if(flag) ans++;
}while(next_permutation(d,d+10));
cout << ans << endl;
return 0;
}
1265 四阶幻方 (未优化)
同理 全排列 但是程序运行时间比较长 应该是需要优化的
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int main()
{
int ans = 0;
do
{
int sum1= a[0]+a[1]+a[2]+a[3];
int sum2= a[4]+a[5]+a[6]+a[7];
int sum3= a[8]+a[9]+a[10]+a[11];
int sum4= a[12]+a[13]+a[14]+a[15];
if(sum1 != sum2 || sum1 != sum3 || sum1 != sum4)
continue;
int sum5= a[0]+a[4]+a[8]+a[12];
int sum6= a[1]+a[5]+a[9]+a[13];
int sum7= a[2]+a[6]+a[10]+a[14];
int sum8= a[3]+a[7]+a[11]+a[15];
if(sum5 != sum6 || sum5 != sum7 || sum5 != sum8)
continue;
int diag1 = a[0]+a[5]+a[10]+a[15];
int diag2 = a[3]+a[6]+a[9]+a[12];
if(diag1 != diag2)
continue;
if(a[0] == 1)
ans ++;
cout << ans << endl;
}while(next_permutation(a,a+16));
cout << ans << endl;
return 0;
}
1266 穿越雷区
本题dfs以及bfs都可以做
//dfs写法 需要剪枝
const int N = 110;
int n;
int x1,x2,y1,y2; //记录起始点(x1,y1),终点(x2,y2)
int ans = 0x3f3f3f3f;
char a[N][N];
int d[N][N];
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};
void dfs(int x,int y,int k)
{
if(k > ans) return ;//如果k > ans 就没必要走下去了
if(x == x2 && y == y2)
{
ans = k;
return ;
}
for(int i = 0; i < 4; i ++)
{
int xx = x+dx[i],yy = y+dy[i];
if(xx >= 1 && xx <= n && yy >= 1 && yy <= n && d[xx][yy] == 0)
{
if(a[x][y] == '+' && a[xx][yy] == '+') continue;
if(a[x][y] == '-' && a[xx][yy] == '-') continue;
d[xx][yy] = 1;
dfs(xx,yy,k+1);
d[xx][yy] = 0; //恢复现场
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
cin >> a[i][j];
if(a[i][j] == 'A')
x1 = i,y1 = j;
if(a[i][j] == 'B')
x2 = i,y2 = j;
}
dfs(x1,y1,0);
if(ans == 0x3f3f3f3f) puts("-1");
else cout << ans << endl;
return 0;
}
//bfs写法
const int N = 110;
int n;
int x1,x2,y1,y2;
char a[N][N];
int d[N][N];
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};
typedef pair<int,int> PII;
queue<PII> q;
int bfs()
{
memset(d,-1,sizeof(d));
d[x1][y1] = 0;
q.push({x1,y1});
while(q.size())
{
auto t = q.front();
q.pop();
int x = t.first,y = t.second;
if(x == x2 && y == y2)
{
return d[x][y];
}
for(int i = 0; i < 4; i ++)
{
int xx = x+dx[i], yy = y+dy[i];
if(xx >= 1 && xx <= n && yy >= 1 && yy <= n && d[xx][yy] == -1)
{
if(a[x][y] == '+' && a[xx][yy] == '+') continue;
if(a[x][y] == '-' && a[xx][yy] == '-') continue;
d[xx][yy] = d[x][y]+1;
q.push({xx,yy});
}
}
}
return -1;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
cin >> a[i][j];
if(a[i][j] == 'A')
x1 = i,y1 = j;
if(a[i][j] == 'B')
x2 = i,y2 = j;
}
cout << bfs() << endl;
return 0;
}
1282 网友年龄
暴力即可