2018 Multi-University Training Contest 4
Posted hetui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018 Multi-University Training Contest 4相关的知识,希望对你有一定的参考价值。
1001:Problem A. Integers Exhibition
1002:Problem B. Harvest of Apples
1003:Problem C. Problems on a Tree
1004:Problem D. Nothing is Impossible
1005:Problem E. Matrix from Arrays
1007:Problem G. Depth-First Search
1010:Problem J. Let Sudoku Rotate
一顿模拟加搜索就可以了,加一个小小的剪枝
#include <cstdio> #include <cstdlib> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <vector> #include <string> #include <map> using namespace std; int sudoku[20][20]; int raw[20][20],col[20][20]; int ans; void init() { memset(raw,0,sizeof(raw)); memset(col,0,sizeof(col)); ans=0x7fffff; } int w[20][20]; void roat(int a,int b)//顺时针旋转矩阵90度 { for(int i=0;i<4;i++) for(int j=0;j<4;j++) w[j][3-i]=sudoku[a+i][b+j]; for(int i=0;i<4;i++) for(int j=0;j<4;j++) sudoku[a+i][b+j]=w[i][j]; } int vis[20],tot; bool check(int a,int b) { for(int i=a;i<a+4;i++) { tot++; for(int j=0;j<b+4;j++) { if(vis[sudoku[i][j]]==tot) return 0; vis[sudoku[i][j]]=tot; } } for(int i=b;i<b+4;i++) { tot++; for(int j=0;j<a+4;j++) { if(vis[sudoku[j][i]]==tot) return 0; vis[sudoku[j][i]]=tot; } } return 1; } void dfs(int x,int y,int step) { if(x==4) { ans=min(ans,step); return; } if(step>=ans) return; if(y==4) return dfs(x+1,0,step); for(int i=0;i<4;i++) { if(check(x*4,y*4)) dfs(x,y+1,step+i); roat(x*4,y*4); } } int solve(void) { int i,j; char str[20]; for(i=0;i<16;i++) { scanf("%s",str); for(j=0;j<16;j++) { if(str[j]>=‘0‘&&str[j]<=‘9‘) sudoku[i][j]=str[j]-‘0‘; else if(str[j]==‘A‘) sudoku[i][j]=10; else if(str[j]==‘B‘) sudoku[i][j]=11; else if(str[j]==‘C‘) sudoku[i][j]=12; else if(str[j]==‘D‘) sudoku[i][j]=13; else if(str[j]==‘E‘) sudoku[i][j]=14; else if(str[j]==‘F‘) sudoku[i][j]=15; else; } } tot=0; dfs(0,0,0); printf("%d ",ans); } int main() { int T; scanf("%d",&T); while(T--) { init(); solve(); } return 0; }
1011:Problem K. Expression in Memories
1012:Problem L. Graph Theory Homework
易证直接从1走到n是最近的,证明方法和证均值不等式一样
#include <cstdio> #include <cstdlib> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <vector> #include <string> #include <map> using namespace std; int sudoku[20][20]; int raw[20][20],col[20][20]; int ans; void init() { memset(raw,0,sizeof(raw)); memset(col,0,sizeof(col)); ans=0x7fffff; } int w[20][20]; void roat(int a,int b)//顺时针旋转矩阵90度 { for(int i=0;i<4;i++) for(int j=0;j<4;j++) w[j][3-i]=sudoku[a+i][b+j]; for(int i=0;i<4;i++) for(int j=0;j<4;j++) sudoku[a+i][b+j]=w[i][j]; } int vis[20],tot; bool check(int a,int b) { for(int i=a;i<a+4;i++) { tot++; for(int j=0;j<b+4;j++) { if(vis[sudoku[i][j]]==tot) return 0; vis[sudoku[i][j]]=tot; } } for(int i=b;i<b+4;i++) { tot++; for(int j=0;j<a+4;j++) { if(vis[sudoku[j][i]]==tot) return 0; vis[sudoku[j][i]]=tot; } } return 1; } void dfs(int x,int y,int step) { if(x==4) { ans=min(ans,step); return; } if(step>=ans) return; if(y==4) return dfs(x+1,0,step); for(int i=0;i<4;i++) { if(check(x*4,y*4)) dfs(x,y+1,step+i); roat(x*4,y*4); } } int solve(void) { int i,j; char str[20]; for(i=0;i<16;i++) { scanf("%s",str); for(j=0;j<16;j++) { if(str[j]>=‘0‘&&str[j]<=‘9‘) sudoku[i][j]=str[j]-‘0‘; else if(str[j]==‘A‘) sudoku[i][j]=10; else if(str[j]==‘B‘) sudoku[i][j]=11; else if(str[j]==‘C‘) sudoku[i][j]=12; else if(str[j]==‘D‘) sudoku[i][j]=13; else if(str[j]==‘E‘) sudoku[i][j]=14; else if(str[j]==‘F‘) sudoku[i][j]=15; else; } } tot=0; dfs(0,0,0); printf("%d ",ans); } int main() { int T; scanf("%d",&T); while(T--) { init(); solve(); } return 0; }
以上是关于2018 Multi-University Training Contest 4的主要内容,如果未能解决你的问题,请参考以下文章
2018 Multi-University Training Contest 2
2018 Multi-University Training Contest 9
2018 Multi-University Training Contest 4
2018 Multi-University Training Contest 4