Codeforce219C-Color Stripe

E. Color Stripe
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

A colored stripe is represented by a horizontal row of n square cells, each cell is pained one of k colors. Your task is to repaint the minimum number of cells so that no two neighbouring cells are of the same color. You can use any color from 1 to k to repaint the cells.

Input

The first input line contains two integers n and k (1 ≤ n ≤ 5·105; 2 ≤ k ≤ 26). The second line contains n uppercase English letters. Letter "A" stands for the first color, letter "B" stands for the second color and so on. The first k English letters may be used. Each letter represents the color of the corresponding cell of the stripe.

Output

Print a single integer — the required minimum number of repaintings. In the second line print any possible variant of the repainted stripe.

Examples
input
Copy
6 3
ABBACC
output
Copy
2
ABCACA
input
Copy
3 2
BBB
output
Copy
1
BAB

题意:给你一行n个元素,k种颜色,要求相邻的元素颜色不能相同,输出最少改变颜色的数量和n个元素最后的颜色(若有多种可能可任意输出一种)
注意:k==2时必定是奇偶位不相同,要选一个最少改变方案,所以要知道奇位放A要改变的数多还是偶位放A要改变的数多,在训练时卡在这种情况了,
其实一开始想到了ABBA这种情况,但当时的思路是只改变相同颜色的元素,没想到不同颜色元素也能改变,所以当时就假设如果有偶数个相同颜色的元素,其两边元素颜色必不同,结果就一直wrong answer on the test 15...
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int amn=5e5+5;
  4 char mp[amn];
  5 int a[amn],c[30];
  6 int main(){
  7     int n,k;
  8     ios::sync_with_stdio(0);
  9     cin>>n>>k;
 10     for(int i=1;i<=n;i++){
 11         cin>>mp[i];
 12         a[i]=mp[i]-'A'+1;
 13     }
 14     int ans=0,c1=0,c2=0;
 15     if(k==2){       ///k==2时必定是奇偶位不相同,要选一个最少改变方案,所以要知道奇位放A要改变的数多还是偶位放A要改变的数多
 16         for(int i=1;i<=n;i++){  /// 我们先假设奇位为A,偶位为B,因为有可能合法情况是偶位为A,奇数位为B,所以最后要比较哪个不合法的数量少,这样更改少的那个才能得到最少改变方案,故下面统计不合法数,
 17             if(i%2==0){     ///若偶位为A,则A的不合法数加1,否则B的不合法数加1
 18                 if(mp[i]=='A')c1++;
 19                 else c2++;
 20             }
 21             else{           ///若偶位为A,则B的不合法数加1,否则A的不合法数加1
 22                 if(mp[i]=='A')c2++;
 23                 else c1++;
 24             }
 25         }
 26         ans=min(c1,c2); ///选一个最小不合法数,得到最少改变方案
 27         for(int i=1;i<=n;i++){
 28             if(ans==c1){    ///若偶数位为A是不合法的,要将奇位变为A,偶位变为B
 29                 if(i%2) 
 30                     mp[i]='A';
 31                 else
 32                     mp[i]='B';
 33             }
 34             else{
 35                 if(i%2)     ///若奇数为位A是不合法的,要将偶数位变为A,奇数位变为B
 36                     mp[i]='B';
 37                 else
 38                     mp[i]='A';
 39             }
 40         }
 41     }
 42     else{
 43     a[n+1]=27;
 44     memset(c,0,sizeof c);
 45     bool f=0,d=0;
 46     int fr=1,ta=0,frc,mic,tac,it,cc;
 47     for(int i=2;i<=n;i++){
 48         if(a[i]==a[i-1]){
 49             d=1;
 50             if(fr>ta){
 51                 fr=i-1;
 52                 if(i-2>=1){
 53                     frc=a[fr-1];//cout<<frc<<'!'<<endl;
 54                     c[a[i]]=c[frc]=1;
 55                 }
 56                 else{
 57                     c[a[i]]=1;
 58                     f=1;
 59                 }
 60                 mic=a[i];
 61                 ta=i+1;
 62                 tac=a[ta];
 63                 c[tac]=1;
 64             }
 65             else{
 66 
 67                 ta=i+1;
 68                 tac=a[ta];
 69                 c[tac]=1;
 70             }
 71                 //printf("i:%d fr:%d ta:%d\n",i,fr,ta);
 72                 if(!f&&i==n){
 73                     ans+=(ta-fr)/2;
 74                     it=fr+1;
 75                     cc=frc;
 76                     while(it<ta){
 77                         a[it]=cc;
 78                         mp[it]=a[it]-1+'A';
 79                         it+=2;
 80                     }
 81                     break;
 82                 }
 83 
 84         }
 85         else if(d){
 86             //printf("i:%d fr:%d ta:%d tac:%d\n",i,fr,ta,tac);
 87             d=0;
 88             ans+=(ta-fr)/2;
 89             if(f){
 90                 cc=tac;
 91                 if(ta>n)
 92                     for(int i=1;i<=k;i++){
 93                         if(!c[i]){
 94                             cc=i;
 95                             break;
 96                         }
 97                     }
 98                 it=ta-2;
 99                 while(it>0){
100                     a[it]=cc;
101                     mp[it]=a[it]-1+'A';
102                     it-=2;
103                 }
104                 f=0;
105             }
106             else{
107                 cc=frc;
108                 //printf("---\ni:%d frc: %d tac: %d\n",i,frc,tac);
109                 //for(int i=1;i<=26;i++)cout<<c[i]<<' ';
110                 //cout<<"\n---\n";
111                 if(frc==tac){
112                     for(int i=1;i<=k;i++){
113                         if(!c[i]){
114                             cc=i;
115                             break;
116                         }
117                     }
118                 }
119                 //cout<<i<<'?'<<cc<<endl;
120                 memset(c,0,sizeof c);
121                     it=fr+1;
122                     while(it<ta){
123                         a[it]=cc;
124                         mp[it]=a[it]-1+'A';
125                         it+=2;
126                     }
127             }
128             fr=ta;
129             ta--;
130         }
131     }
132     if(f){
133         ans+=(ta-fr)/2;
134         for(int i=1;i<=k;i++){
135                         if(!c[i]){
136                             cc=i;
137                             break;
138             }
139         }
140         memset(c,0,sizeof c);
141                     it=fr+1;
142                     while(it<ta){
143                         a[it]=cc;
144                         mp[it]=a[it]-1+'A';
145                         it+=2;
146                     }
147             fr=ta;
148             ta--;
149     }
150     }
151     cout<<ans<<endl;
152     cout<<mp+1<<endl;
153 }

 

 

转载于:https://www.cnblogs.com/Railgun000/p/11270244.html

### 回答1: #include <stdio.h> int main(){ //定义一个3*3的数组用来存储棋盘 int board[3][3]={0}; int x,y,turn=1; while (1){ //打印棋盘 printf("当前棋盘:\n"); for (x=0;x<3;x++){ for (y=0;y<3;y++){ printf("%d ",board[x][y]); } printf("\n"); } //根据turn的值来判断谁轮到落子 if (turn==1){ printf("轮到X落子,请输入落子的位置(x y):"); }else { printf("轮到O落子,请输入落子的位置(x y):"); } scanf("%d %d",&x,&y); //将落子位置的值设置为对应的值 board[x][y] = turn; //改变轮到谁落子 turn = -turn; //判断谁赢了 if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[2][2]!=0){ printf("游戏结束,获胜者是%c\n",board[0][0]==1?'X':'O'); break; } if (board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[0][2]!=0){ printf("游戏结束,获胜者是%c\n",board[2][0]==1?'X':'O'); break; } for (x=0;x<3;x++){ if (board[x][0]==board[x][1] && board[x][1]==board[x][2] && board[x][2]!=0){ printf("游戏结束,获胜者是%c\n", board[x][0] == 1 ? 'X' : 'O'); break; } if (board[0][x]==board[1][x] && board[1][x]==board[2][x] && board[2][x]!=0){ printf("游戏结束,获胜者是%c\n", board[0][x] == 1 ? 'X' : 'O'); break; } } } return 0; } ### 回答2: 为了回答这个问题,需要提供题目的具体要求和规则。由于提供的信息不够具体,无法为您提供准确的代码。但是,我可以给您一个简单的Tic-tac-toe游戏的示例代码,供您参考: ```c #include <stdio.h> #include <stdbool.h> // 判断游戏是否结束 bool isGameOver(char board[][3]) { // 判断每行是否有3个相同的棋子 for(int i = 0; i < 3; i++) { if(board[i][0] != '.' && board[i][0] == board[i][1] && board[i][0] == board[i][2]) { return true; } } // 判断每列是否有3个相同的棋子 for(int i = 0; i < 3; i++) { if(board[0][i] != '.' && board[0][i] == board[1][i] && board[0][i] == board[2][i]) { return true; } } // 判断对角线是否有3个相同的棋子 if(board[0][0] != '.' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) { return true; } if(board[0][2] != '.' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) { return true; } return false; } // 输出棋盘 void printBoard(char board[][3]) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { printf("%c ", board[i][j]); } printf("\n"); } } int main() { char board[3][3]; // 初始化棋盘 for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { board[i][j] = '.'; } } int player = 1; // 玩家1先下 int row, col; while(true) { printf("Player %d's turn:\n", player); printf("Row: "); scanf("%d", &row); printf("Column: "); scanf("%d", &col); // 判断输入是否合法 if(row < 0 || row >= 3 || col < 0 || col >= 3 || board[row][col] != '.') { printf("Invalid move. Try again.\n"); continue; } // 下棋 board[row][col] = (player == 1) ? 'X' : 'O'; // 输出棋盘 printBoard(board); // 判断游戏是否结束 if(isGameOver(board)) { printf("Player %d wins!\n", player); break; } // 切换玩家 player = (player == 1) ? 2 : 1; } return 0; } ``` 这段代码实现了一个简单的命令行下的Tic-tac-toe游戏。玩家1使用'X'棋子,玩家2使用'O'棋子。玩家依次输入行和列,下棋后更新棋盘,并判断游戏是否结束。当游戏结束时,会输出获胜者并结束游戏。 ### 回答3: 题目要求实现一个井字棋游戏的判断胜负函数。给定一个3x3的井字棋棋盘,用C语言编写一个函数,判断当前是否存在某个玩家获胜或者平局。 题目要求代码中定义一个3x3的字符数组board来表示棋盘,其中 'X' 表示玩家1在该位置放置了一个棋子, 'O' 表示玩家2在该位置放置了一个棋子, '.' 表示该位置没有棋子。 下面是实现此题的C语言代码: ```c #include <stdio.h> #include <stdbool.h> // 用于使用bool类型 bool checkWin(char board[3][3]) { // 检查每一行是否有获胜的情况 for (int row = 0; row < 3; row++) { if (board[row][0] == board[row][1] && board[row][1] == board[row][2] && board[row][0] != '.') { return true; } } // 检查每一列是否有获胜的情况 for (int col = 0; col < 3; col++) { if (board[0][col] == board[1][col] && board[1][col] == board[2][col] && board[0][col] != '.') { return true; } } // 检查对角线是否有获胜的情况 if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != '.') || (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != '.')) { return true; } return false; // 没有获胜的情况 } int main() { char board[3][3]; // 存储棋盘状态 // 读取棋盘状态 for (int i = 0; i < 3; i++) { scanf("%s", board[i]); } // 调用检查胜负的函数,并输出结果 if (checkWin(board)) { printf("YES\n"); } else { printf("NO\n"); } return 0; } ``` 这个程序中定义了一个函数checkWin,用于检查是否有玩家获胜。遍历棋盘的每一行、每一列和对角线,判断是否有连续相同的字符且不为'.',如果有,则返回true;否则返回false。 在主函数main中,首先定义一个3x3的字符数组board,然后通过循环从标准输入中读取棋盘状态。接着调用checkWin函数进行胜负判断,并根据结果输出"YES"或者"NO"。最后返回0表示程序正常结束。 请注意,该代码只包含了检查胜负的功能,并没有包含其他如用户输入、判断平局等功能。如果需要完整的游戏代码,请告知具体要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值