ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[算法导论] 搭积木

2021-07-29 22:32:46  阅读:159  来源: 互联网

标签:blocks int self 导论 pos else 算法 搭积木 return


 

 

#include<iostream>
#include<string>
#include<bits/stdc++.h>
using namespace std;
int mv_on(int n1,int n2,int dp[25][25],int n){ //mv a on b a清空放b清空之上
    int ix1=-1,ix2=-1,iy1=-1,iy2=-1;
    for(int i=0;i<n;i++){
        for(int j=0;j<25;j++){
            if(ix1==-1 && n1==dp[i][j]){
                ix1=i;iy1=j;
            };
            if(ix2==-1 && n2==dp[i][j]){
                ix2=i;iy2=j;
            };
        }
        if(ix1!=-1 && ix2!=-1){
                break;
        };
    }
    if(ix1==ix2){return 1;}
    for(int i=1;i<25-iy1;++i){
        for(int j=0;j<25;++j){
            if(dp[ix1][iy1+i]!=-1&&dp[dp[ix1][iy1+i]][j]==-1){
                dp[dp[ix1][iy1+i]][j]=dp[ix1][iy1+i];
                dp[ix1][iy1+i]=-1;
                break;
            }
        }
    }
    for(int i=1;i<25-iy2;++i){
        for(int j=0;j<25;++j){
            if(dp[ix2][iy2+i]!=-1&&dp[dp[ix2][iy2+i]][j]==-1){
                dp[dp[ix2][iy2+i]][j]=dp[ix2][iy2+i];
                dp[ix2][iy2+i]=-1;
                break;
            }
        }
    }
    dp[ix2][iy2+1]=dp[ix1][iy1];
    dp[ix1][iy1]=-1;
    return 1;
}
int mv_ov(int n1,int n2,int dp[25][25],int n){ //mv a ov b a清空放b之上
    int ix1=-1,ix2=-1,iy1=-1,iy2=-1;
    for(int i=0;i<n;i++){
        for(int j=0;j<25;j++){
            if(ix1==-1 && n1==dp[i][j]){
                ix1=i;iy1=j;
            };
            if(ix2==-1 && n2==dp[i][j]){
                ix2=i;iy2=j;
            };
        }
        if(ix1!=-1 && ix2!=-1){
                break;
        };
    }
    if(ix1==ix2){return 1;}
    for(int i=1;i<25-iy1;++i){
        for(int j=0;j<25;++j){
            if(dp[ix1][iy1+i]!=-1&&dp[dp[ix1][iy1+i]][j]==-1){
                dp[dp[ix1][iy1+i]][j]=dp[ix1][iy1+i];
                dp[ix1][iy1+i]=-1;
                break;
            }
        }
    }
    for(int j=1;j<25-iy2;++j){
        if(dp[ix2][iy2+j]==-1){
            dp[ix2][iy2+j]=dp[ix1][iy1];
            dp[ix1][iy1]=-1;
            break;
        }
    }
    return 1;
}
int st_on(int n1,int n2,int dp[25][25],int n){ //st a on b a放b清空之上
    int ix1=-1,ix2=-1,iy1=-1,iy2=-1;
    for(int i=0;i<n;i++){
        for(int j=0;j<25;j++){
            if(ix1==-1 && n1==dp[i][j]){
                ix1=i;iy1=j;
            };
            if(ix2==-1 && n2==dp[i][j]){
                ix2=i;iy2=j;
            };
        }
        if(ix1!=-1 && ix2!=-1){
                break;
        };
    }
    if(ix1==ix2){return 1;}
    for(int i=1;i<25-iy2;++i){
        for(int j=0;j<25;++j){
            if(dp[ix2][iy2+i]!=-1&&dp[dp[ix2][iy2+i]][j]==-1){
                dp[dp[ix2][iy2+i]][j]=dp[ix2][iy2+i];
                dp[ix2][iy2+i]=-1;
                break;
            }
        }
    } //b上清空到原位置
    int c=0;
    for(int j=1;j<25-iy2;++j){
        if(dp[ix1][iy1+c]!=-1&&dp[ix2][iy2+j]==-1){
            dp[ix2][iy2+j]=dp[ix1][iy1+c];
            dp[ix1][iy1+c]=-1;
         }
        c++;
    }
    return 1;
}
int st_ov(int n1,int n2,int dp[25][25],int n){ //st a ov b a放b之上
    int ix1=-1,ix2=-1,iy1=-1,iy2=-1;
    for(int i=0;i<n;i++){
        for(int j=0;j<25;j++){
            if(ix1==-1 && n1==dp[i][j]){
                ix1=i;iy1=j;
            };
            if(ix2==-1 && n2==dp[i][j]){
                ix2=i;iy2=j;
            };
        }
        if(ix1!=-1 && ix2!=-1){
                break;
        };
    }
    if(ix1==ix2){return 1;}
    int c=0;
    for(int j=1;j<25-iy2;++j){
        if(dp[ix1][iy1+c]!=-1&&dp[ix2][iy2+j]==-1){
            dp[ix2][iy2+j]=dp[ix1][iy1+c];
            dp[ix1][iy1+c]=-1;
            c++;
        }
    }
    return 1;
}
int xh_an(int n1,int n2,int dp[25][25],int n){ //xh a an b 交换列
    int ix1=-1,ix2=-1;
    for(int i=0;i<n;i++){
        for(int j=0;j<25;j++){
            if(ix1==-1 && n1==dp[i][j]){
                ix1=i;
            };
            if(ix2==-1 && n2==dp[i][j]){
                ix2=i;
            };

        }
        if(ix1!=-1 && ix2!=-1){
                break;
        };
    }
    if(ix1==ix2){return 1;}
    int tmp[25]={-1};//初始化为-1
    for(int i=0;i<25;i++){
        tmp[i]=dp[ix1][i];
    }
    for(int i=0;i<25;i++){
        dp[ix1][i]=dp[ix2][i];
    }
    for(int i=0;i<25;i++){
        dp[ix2][i]=tmp[i];
    }
    return 1;
}

int jimu_main(){
    int n;string o1,o2;int n1,n2;
    cin>>n;
    int dp[25][25];//二维初始化不能用={-1}
    for(int i=0;i<25;i++){
        for(int j=0;j<25;j++){
            dp[i][j]=-1;}
    }
    for(int k=0;k<n;k++){
        dp[k][0]=k;
    }
    //操作
    //for(int i=0;i<n-1;i++){
    while(cin>>o1&&o1!="q"){
         cin>>n1>>o2>>n2;
        if(n1==n2){
            continue;
        }else if(o1=="mv"&&o2=="on"){
            mv_on(n1,n2,dp,n);
        }else if(o1=="mv"&&o2=="ov"){
            mv_ov(n1,n2,dp,n);
        }else if(o1=="st"&&o2=="on"){
            st_on(n1,n2,dp,n);
        }else if(o1=="st"&&o2=="ov"){
            st_ov(n1,n2,dp,n);
        }else if(o1=="xh"&&o2=="an"){
            xh_an(n1,n2,dp,n);
        }
    }
    for(int j=0;j<n;j++){
        cout<<j<<":";
        for(int x=0;dp[j][x]!=-1&&x<25;x++){
            cout<<" "<<dp[j][x];
        }
        cout<<endl;
    }
    return 1;
}
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
void getCommand(string &line, string &command, int &a, string &opt, int &b) {
  int cnt = 0;
  string tmp = "";
  int num = 0;
  for (char x: line) {
    if(x == ' ') {
      if(cnt == 0) command = tmp;
      else if(cnt == 1) a = num;
      else if(cnt == 2) opt = tmp;
      else if(cnt == 3) b = num;
      cnt ++;
      num = 0;
      tmp = "";
    }else {
      if(cnt == 0 || cnt == 2) tmp += x;
      else if(cnt == 1 || cnt == 3) num = num * 10 + x - '0';
    }
  }
  b = num;
}
void findIJ(vector<vector<int> > &v, int n, int a, int b, int &a_i, int &a_j, int &b_i, int &b_j) {
  a_i = -1; a_j = -1; b_i = -1; b_j = -1;
  for (int i = 0; i < n; ++ i) {
    for (int j = 0; j < v[i].size(); ++ j) {
      if(v[i][j] == a) {
        a_i = i; a_j = j;
      }
      if(v[i][j] == b) {
        b_i = i; b_j = j;
      }
    }
  }
}
void mvOn(vector<vector<int> > &v, int a_i, int a_j, int b_i, int b_j) {
  if(a_i == -1 || a_j == -1 || b_i == -1 || b_j == -1) return;
  int a = v[a_i][a_j], b = v[b_i][b_j];
  if(a == b || a_i == b_i) return;
  // for (int i = v[a_i].size() - 1; i > a_j; -- i) {
  //   if(a_i == v[a_i][i]) return ;
  // }
  // for (int i = v[b_i].size() - 1; i > b_j; -- i) {
  //   if(b_i == v[b_i][i]) return;
  // }
  for (int i = v[a_i].size() - 1; i >= a_j; -- i) {
    if(i != a_j) v[v[a_i][i]].push_back(v[a_i][i]);
    v[a_i].pop_back();
  }
  for (int i = v[b_i].size() - 1; i > b_j; -- i) {
    v[v[b_i][i]].push_back(v[b_i][i]);
    v[b_i].pop_back();
  }
  v[b_i].push_back(a);
}
void mvOv(vector<vector<int> > &v, int a_i, int a_j, int b_i, int b_j) {
  if(a_i == -1 || a_j == -1 || b_i == -1 || b_j == -1) return;  
  int a = v[a_i][a_j], b = v[b_i][b_j];
  if(a == b || a_i == b_i) return;
  // for (int i = v[a_i].size() - 1; i > a_j; -- i) {
  //   if(a_i == v[a_i][i]) return ;
  // }
  for (int i = v[a_i].size() - 1; i >= a_j; -- i) {
    if(i != a_j) v[v[a_i][i]].push_back(v[a_i][i]);
    v[a_i].pop_back();
  }
  v[b_i].push_back(a);
}
void stOn(vector<vector<int> > &v, int a_i, int a_j, int b_i, int b_j) {
  if(a_i == -1 || a_j == -1 || b_i == -1 || b_j == -1) return;  
  int a = v[a_i][a_j], b = v[b_i][b_j];
  if(a == b || a_i == b_i) return;
  // for (int i = v[b_i].size() - 1; i > b_j; -- i) {
  //   if(b_i == v[b_i][i]) return ;
  // }
  for (int i = v[b_i].size() - 1; i > b_j; -- i) {
    v[v[b_i][i]].push_back(v[b_i][i]);
    v[b_i].pop_back();
  }
  for (int i = a_j; i < v[a_i].size(); ++ i) {
    v[b_i].push_back(v[a_i][i]);
  }
  for (int i = v[a_i].size() - 1; i >= a_j; -- i) {
    v[a_i].pop_back();
  }
}
void stOv(vector<vector<int> > &v, int a_i, int a_j, int b_i, int b_j) {
  if(a_i == -1 || a_j == -1 || b_i == -1 || b_j == -1) return;  
  int a = v[a_i][a_j], b = v[b_i][b_j];
  if(a == b || a_i == b_i) return;
  for (int i = a_j; i < v[a_i].size(); ++ i) {
    v[b_i].push_back(v[a_i][i]);
  }
  for (int i = v[a_i].size() -1; i >= a_j; -- i) {
    v[a_i].pop_back();
  }
}
void xhAn(vector<vector<int> > &v, int a, int b) {
  if(a == -1 || b == -1 || a == b) return;  
  swap(v[a], v[b]);
}
int main() {
  int n, a = -1, b = -1;
  int a_i, a_j, b_i, b_j;
  string line, command = "", opt = "";
  cin >> n;
  getchar();
  vector<vector<int> > v(n+5, vector<int>(0));
  for (int i = 0; i < n; ++ i) v[i].push_back(i);
  while(getline(cin, line)) {
    if(line == "q") break;
    getCommand(line, command, a, opt, b);
    if(command == "mv" && opt == "on") {
      findIJ(v, n, a, b, a_i, a_j, b_i, b_j);
      mvOn(v, a_i, a_j, b_i, b_j);
    }else if(command == "mv" && opt == "ov") {
      findIJ(v, n, a, b, a_i, a_j, b_i, b_j);
      mvOv(v, a_i, a_j, b_i, b_j);
    }else if(command == "st" && opt == "on") {
      findIJ(v, n, a, b, a_i, a_j, b_i, b_j);
      stOn(v, a_i, a_j, b_i, b_j);
    }else if(command == "st" && opt == "ov") {
      findIJ(v, n, a, b, a_i, a_j, b_i, b_j);
      stOv(v, a_i, a_j, b_i, b_j);
    }else if(command == "xh" && opt == "an") {
      findIJ(v, n, a, b, a_i, a_j, b_i, b_j);
      xhAn(v, a_i, b_i);
    }
  }
  for (int i = 0; i < n; ++ i) {
    if(v[i].size() == 0) {
      printf("%d:\n", i);
    }else {
      printf("%d:", i);
      for (int x: v[i]) {
        printf(" %d", x);
      }
      printf("\n");
    } 
  }
  return 0;
}
class buildingBlocks():
    
    def __init__(self,n) -> None:
        self.block_num = n
        self.blocks = {i:[i] for i in range(n)}
    def mv_on(self,a,b):
        pos_a,pos_b = self.search(a),self.search(b)
        if pos_a == pos_b:
            return
        self.reset(pos_a,a)
        self.reset(pos_b,b)
        self.blocks[pos_a].pop()
        self.blocks[pos_b].append(a)
    def mv_ov(self,a,b):
        pos_a,pos_b = self.search(a),self.search(b)
        if pos_a == pos_b:
            return
        self.reset(pos_a,a)
        self.blocks[pos_a].pop()
        self.blocks[pos_b].append(a)
    def st_on(self,a,b):
        pos_a,pos_b = self.search(a),self.search(b)
        if pos_a == pos_b:
            return
        self.reset(pos_b,b)
        result = self.getBlockAboutTarget(pos_a,a)[::-1]
        self.blocks[pos_b] += result
    def st_ov(self,a,b):
        pos_a,pos_b = self.search(a),self.search(b)
        if pos_a == pos_b:
            return
        result = self.getBlockAboutTarget(pos_a,a)[::-1]
        self.blocks[b] += result
    def xh_an(self,a,b):
        pos_a,pos_b = self.search(a),self.search(b)
        if pos_a == pos_b:
            return
        self.blocks[pos_a],self.blocks[pos_b] = self.blocks[pos_b],self.blocks[pos_a]
    def reset(self,pos,target):
        for i in reversed(range(len(self.blocks[pos]))):
            cur_block = self.blocks[pos].pop()
            if cur_block == target:
                self.blocks[pos].append(cur_block)
                break
            else:
                self.blocks[cur_block].insert(0,cur_block)
    def search(self,id):
        for k,v in self.blocks.items():
            if id in v:
                return k
    def getBlockAboutTarget(self,pos,target):
        result = []
        while True:
            temp = self.blocks[pos].pop()
            result.append(temp)
            if temp == target:
                break     
        return result
    def printInfo(self):
        for k,v in self.blocks.items():
            if v == []:
                print("{}:".format(k))
            else:
                print("{}: {}".format(k," ".join([str(b) for b in v])))
def building(blocks):
    try:
        while True:
            instruction = input()
            if instruction == 'q':
                break
            else:
                instruction = instruction.split()
            a,b = int(instruction[1]),int(instruction[3])
            if a == b:
                continue
            operator = instruction[0] + " " + instruction[2]
            if operator == "mv on":
                blocks.mv_on(a,b)
            elif operator == "mv ov":
                blocks.mv_ov(a,b)
            elif operator == "st on":
                blocks.st_on(a,b)
            elif operator == "st ov":
                blocks.st_ov(a,b)
            elif operator == "xh an":
                blocks.xh_an(a,b)
    except:
        pass
    
if __name__ == "__main__":
    n = int(input())
    bb = buildingBlocks(n)
    building(bb)
    bb.printInfo()

标签:blocks,int,self,导论,pos,else,算法,搭积木,return
来源: https://blog.csdn.net/Trance95/article/details/119221589

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有